利用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原创文章,未经本站允许不得转载。