使用反射机制的步骤:

首先:导入java.lang.reflect包

然后:遵循三个步骤:
1、获得你想操作的类的java.lang.Class对象
2、调用诸如getDeclaredMethods的方法
3、使用反射API来操作这些信息

1、获得Class对象的三种方法
(1)已经得到一个类的实例,可以使用如下方式来得到Class对象:

Class c = 对象名.getClass();
例如:
TextField t = new TextField();
Class c = t.getClass();
Class s = c.getSuperClass();

(2)如果再编译期知道类的名字,可以使用如下方法:

Class c = java.awt.Button.class;
或者:
Class c = Integer.Type;

(3)如果类名在编译器不知道,但是在运行期可以获得,可以使用下面的方法:

Class c = Class.forName(str);
注意:str是类的全路径
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.getClass() == gctObj2.getClass():" + (gctObj.getClass() == gctObj2.getClass()));
        gctObj2.print();

        Field[] field = clazzClass.getDeclaredFields();
        for (Field me : field) {
            System.out.println("shu:" + me);
        }
    }
}

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();语句时,又生成了一个对象。但这时候类已经加载完毕,静态的东西已经加载到内存中,而静态代码块只执行一次,所以不用再去加载类,所以只会打印“构造方法运行”,而“静态代码块运行”不会打印。

反射机制不但可以列出该类对象所拥有的方法和属性,还可以获得该类的构造方法及通过构造方法获得实例。也可以动态的调用这个实例的成员方法。