利用java.lang.relfect包如何使用反射机制的步骤
使用反射机制步骤如下
1. 导入java.lang.relfect 包
2. 获得你想操作的类的 java.lang.Class 对象
3. 调用诸如 getDeclaredMethods 的方法
4. 使用反射API 来操作这些信息
获取class对象的3种方法
1. 已经得到一个类的实例,可以使用如下方式来得到Class对象.
Class c = 对象名.getClass();
2. 如果在编译期知道类的名字,可以使用如下方法.
Class c = java.awt.Button.class;
或
Class c = Integer.TYPE;
3. 如果类名在编译期不知道, 但是在运行期可以获得, 可以使用下面的方法
Class c = Class.forName(str); //注意:str是类的全路径
例子
package com.reflection.classForName; public class GetClassTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException { System.out.println("测试开始"); GetClassTestObj gctObj = new GetClassTestObj(); Class < ?extends GetClassTestObj > clazzClass = gctObj.getClass(); //同过反射机制得到类的对象 System.out.println("clazzClass:" + clazzClass); GetClassTestObj gctObj2 = (GetClassTestObj) clazzClass.newInstance(); //调用无参构造方法,创建一个对象 System.out.println("gctObj==gctOb2 :" + (gctObj == gctObj2)); System.out.println("gctObj.getClass() == gctOb2.getClass() :" + (gctObj.getClass() == gctObj2.getClass())); gctObj2.print(); // Field[] field=clazzClass.getDeclaredFields(); // for(Field me : field){ // System.out.println("shu:"+me); // } } } package com.reflection.classForName; public class GetClassTestObj { static { //静态代码块,只执行一次 System.out.println("nihao"); } private String name = "chen"; public String address = "chengdu"; public void print() { System.out.println("name:" + name + " ,address:" + address); } }
这样获得Class类对象的方法,其实是利用反射API把指定字符串的类加载到内存中,所以也叫类加载器加载方法。这样的话,它会把该类的静态方法和静态属性,以及静态代码全部加载到内存中。但这时候,对象还没有产生。所以为什么静态方法不能访问非静态属性和方法。因为静态方法和属性产生的时机在非静态属性和方法之前。
在进行 gctObj.getClass()的时候,实际上是对指定类进行类加载,这时候,会把静态属性、方法以及静态代码块都加载到内存中。所以这时候会打印出"静态代码块运行"。但这时候,对象却还没有产生。所以"构造方法运行"这几个字不会打印。当执行cla.newInstance()的时候,就是利用反射机制将Class对象生成一个该类的一个实例。这时候对象就产生了。所以打印"构造方法运行"。当执行到GetClassTestObj gctObj = new GetClassTestObj();语句时,又生成了一个对象。但这时候类已经加载完毕,静态的东西已经加载到内存中,而静态代码块只执行一次,所以不用再去加载类,所以只会打印"构造方法运行",而"静态代码块运行"不会打印。
反射机制不但可以例出该类对象所拥有的方法和属性,还可以获得该类的构造方法及通过构造方法获得实例。也可以动态的调用这个实例的成员方法。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。