java反射的学习
1.类的 类类型(ClassType)
类的类类型可以用来做很多事,我们可以通过它获取到类的名称,类的路径,类的成员变量,类的方法等等,还可以通过它获得类的实例化对象。
我们可以通过 类名.class 来得到类的类类型,如下面的 c1
Class c1 = ReflectDemo.class;
我们可以通过类的实例对象得到类的类类型
ReflectDemo demo1 = new ReflectDemo();
Class c2 = demo1.getClass();
还可以通过类的包路径加类名获得类的类类型
Class c3 = Class.forName("reflectdemo.ReflectDemo");
值得注意的是,每个类只有一个类类型,也就是说上面的 c1, c2 , c3 指向的是同一个对象。
在开头也说了,类的类类型同样可以得到类的实例,所以两者可以相互得到。
类自身,类的类类型 和 类的实例对象 的关系如下图:
2.通过类的类类型获取类的成员变量以及方法
自己写了一个方法,通过传入某个类的实例对象,就能得到该类的方法。
其中 getMethod() 方法是获取类中所有public方法,包括父类的 public 方法;getDeclareMethod()方法可以获取本类中声明的所有方法,不论权限
public static void getClassMethods(Object obj){
Class c = obj.getClass(); //获取类类型
Method []ms = c.getMethods(); //获取类中所有的public方法,包括父类中的方法
Method []ms2 = c.getDeclaredMethods(); ////获取该类自己声明的所有方法,不论权限
Field []fields = c.getFields(); //获取类中public级成员变量
for(Field f:fields){
String fieldType = f.getType().getSimpleName(); //获得成员变量类型
String fieldName = f.getName(); //获得成员变量名
System.out.println(fieldType+" "+fieldName);
} for(Method m:ms){
String type = m.getReturnType().getName(); //方法的返回值类型
System.out.print(type+" ");
String methodName=m.getName(); //方法名
System.out.print(methodName+"(");
Class []params = m.getParameterTypes(); //方法中 参数的类类型 元组 for(Class param:params){
String parName = param.getName(); //从参数类类型中得到参数名
System.out.print(parName+" ");
}
System.out.println(");");
} }
3.通过反射来操作方法
除了上面通过getMethods()和getDeclaredMethods()获取方法数组之外,还可以通过getMethod()和getDeclaredMethod()来对单个方法进行查找。
这时就要注意,想要定位一个方法,必须要传入正确的方法名以及参数类类型才行。如下:
public class ReflectDemo2 { public void print(){
System.out.println("a+b");
} public String add(String a,String b){
return a+b;
} public int add(int a,int b){
return a+b;
}
}
我们想要获取对应的方法就要进行如下操作:
ReflectDemo2 demo=new ReflectDemo2();
Class c=ReflectDemo2.class;
try {
//通过传入的方法名称和参数类类型来获得某一确定方法的类类型
// Method m1=c.getMethod("add", new Class[]{int.class,int.class}); //第一个参数为方法名,后面既可以传入一个类类型数组,也可以单独地传入类类型
Method m1=c.getMethod("add",int.class,int.class);
Object obj = m1.invoke(demo, ,); //通过invoke()来执行方法,要传入类的实例对象以及对应参数的值
System.out.println(obj); Method m2=c.getMethod("print"); //如果没有参数要传入,直接输入方法名即可
m2.invoke(demo); //如果方法没有返回值,可以不用获取
} catch (Exception e) {
e.printStackTrace();
} }
结果和平常使用类的实例对象调用方法的结果是一样的。
待编辑。。
java反射的学习的更多相关文章
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
- 云笔记项目-Java反射知识学习
在云笔记项目中,补充了部分反射的知识,反射这一部分基础知识非常重要,前面学习的框架Spring和MyBatis读取xml配置文件创建对象,以及JDBC加载驱动等都用了反射,但只知道有这个东西,具体不知 ...
- Java反射机制——学习总结
前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
- Java 反射机制学习资料
Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...
- Java反射机制学习
Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...
- JAVA反射机制学习随笔
JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...
- java反射机制学习代码
根据 http://www.iteye.com/topic/137944 文档进行学习 代码如下: package reflectTest; import java.lang.reflect.*; i ...
- Java反射篇学习笔记
今天重新学习了java中的反射,写一篇学习笔记总结一下.代码基本都是照着两篇博客敲的: 参考一: https://blog.csdn.net/sinat_38259539/article/deta ...
- java反射机制学习小结
之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...
随机推荐
- jq的链式调用.end();
先上code <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- STM32CubeMX+FreeRTOS 定时器os_timer的使用
转载:https://blog.csdn.net/jacklondonjia/article/details/78497120在STM32CubeMX的FreeRTOS配置中,使能FreeRTOS的S ...
- Linux centosVMware 压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具。
一.压缩打包介绍 Lnux下常见的压缩文件通常是.tar.gz模式,还有.tar..gz..bz2..zip..tar.bz2..tar.xz. .gz:表示由gzip压缩工具压缩的文件 .bz2:表 ...
- Windows Mysql Server重启, log-bin路径配置
Windows Mysql Server重启, log-bin路径配置 分类: mysql数据库2014-03-16 14:49 1313人阅读 评论(0) 收藏 举报 Mysqlmysql serv ...
- Vue3中的Proxy作用在哪里?
目录 前言 Vue没有Proxy会怎么样? proxy开始 前言 在讲解Proxy之前,我们有些前置知识点是必要掌握的: Object相关静态函数 Reflect相关静态函数 简单说明知识盲点 名称 ...
- 十八 JQuery&Ajax&Json&Xstream
JQuery 1 是什么?有什么用? JavaScript的代码类库 简化代码,提高效率.write less do more 1 JQuery与Servlet数据交互,load方式(少用) 语法:$ ...
- 设备树DTS 学习: uboot 传递 dtb 给 内核
背景 得到 dtb 文件以后,我们需要想办法下载到 板子中,并给 Linux 内核使用. (高级版本的 uboot也有了 自己使用设备树支持,我们这里不讨论 uboot 使用的设备树) Linux 内 ...
- 2-10 就业课(2.0)-oozie:7、job任务的串联
4.4.oozie的任务串联 在实际工作当中,肯定会存在多个任务需要执行,并且存在上一个任务的输出结果作为下一个任务的输入数据这样的情况,所以我们需要在workflow.xml配置文件当中配置多个ac ...
- PHPXhprof扩展在windows安装
1.下载在这里 http://dev.freshsite.pl/php-extensions/xhprof.html.(找不到资源可以私我我给你,这个上传不了资源) 注意:一定要找对应的php版本,t ...
- lucene实践 - 索引维护、多域查询、高亮显示
之前的博客搜索栏用的是 sql 模糊查询进行查找,最近学完lucene,要学以致用啊,就把sql搜索给替换下来吧 中间遇到一些问题,也是学过程中没有提到的,所以说,还是实践出真知啊. lucene分开 ...