相关文章:
Java Relfect
Java RelfectUtils
反射一:基本类周边信息获取
反射二:泛型相关周边信息获取
反射三:类内部信息获取
一、使用反射机制步骤如下
使用反射机制步骤如下
- 导入 java.lang.relfect 包
- 获得你想操作的类的 java.lang.Class 对象
- 调用诸如 getDeclaredMethods 的方法
- 使用反射API 来操作这些信息
获取class对象的3种方法
已经得到一个类的实例,可以使用如下方式来得到Class对象:
Class c = 对象名.getClass();如果在编译期知道类的名字,可以使用如下方法:
Class c = java.lang.String.class;
Class c = Integer.TYPE;如果类名在编译期不知道, 但是在运行期可以获得, 可以使用下面的方法:
Class c = Class.forName(str); // 注意:str是类的全路径
示例:
这样获得 Class 类对象的方法,其实是利用反射 API 把指定字符串的类加载到内存中,所以也叫类加载器加载方法。这样的话,它会把该类的静态方法和静态属性,以及静态代码全部加载到内存中。但这时候,对象还没有产生。所以为什么静态方法不能访问非静态属性和方法。因为静态方法和属性产生的时机在非静态属性和方法之前。
在进行 testObj.getClass() 的时候,实际上是对指定类进行类加载,这时候,会把静态属性、方法以及静态代码块都加载到内存中。所以这时候会打印出”静态代码块运行”。但这时候,对象却还没有产生。所以”构造方法运行”这几个字不会打印。当执行 clazzClass.newInstance() 的时候,就是利用反射机制将 Class 对象生成一个该类的一个实例。这时候对象就产生了。所以打印”构造方法运行”。当执行到 TestClass testObj = new TestClass(); 语句时,又生成了一个对象。但这时候类已经加载完毕,静态的东西已经加载到内存中,而静态代码块只执行一次,所以不用再去加载类,所以只会打印”构造方法运行”,而”静态代码块运行”不会打印。
反射机制不但可以例出该类对象所拥有的方法和属性,还可以获得该类的构造方法及通过构造方法获得实例。也可以动态的调用这个实例的成员方法。
二、获得其他类中的全部构造函数
Java 通过反射机制获取获得其他类中的全部构造函数,步骤所用方法如下:
- forName():返回给定串名相应的Class对象。
- getConstructors():返回当前Class对象表示的类的所有公有构造子对象数组。
示例:
三、实例化一个类的对象
Java 通过反射机制实例化一个类的对象,步骤所用方法如下:
- forName() 返回给定串名相应的Class对象。
- newInstance() 创建类的新实例。
- getConstructors() 返回当前Class对象表示的类的所有公有构造子对象数组。
- getName() 返回Class对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
|
|
四、获取某个类的全部属性
Java反射获取某个类的全部属性,步骤所用方法如下:
- forName():返回给定串名相应的 Class 对象。
- getDeclaredFields():返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。
- getFields():返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。
- getModifiers():返回该类或接口的 Java 语言修改器代码。
- getName():返回 Class 对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
示例代码:
输出结果:
五、操作某个类的属性
Java 通过反射机制操作某个类的属性,步骤所用方法如下:
- forName():返回给定串名相应的Class对象。
- getDeclaredField():返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。
示例:
六、获取某个类的全部方法
Java 通过反射机制获取某个类的全部方法,步骤所用方法如下:
- forName():返回给定串名相应的Class对象。
- getMethods():返回当前Class对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
- getModifiers():返回该类或接口的Java语言修改器代码。
- getName():返回Class对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
示例代码:
七、调用某个类的方法
Java通过反射机制调用某个类的方法,步骤所用方法如下:
- forName():返回给定串名相应的 Class 对象。
- getMethod():返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。
- newInstance():创建类的新实例。
示例代码:
八、取得并修改数组的大小等信息
Java 通过反射机制取得并修改数组的大小等信息,步骤所用方法如下:
- getClass():取得该类已经被实例化了的对象的该类的引用。
- getComponentType():如果当前类表示一个数组,则返回表示该数组组件的Class对象,否则返回null。
- newInstance():创建类的新实例。
示例代码:
参考链接:反射技术