Java 反射

万物皆对象,关于反射的一些整理。

类与对象

// Foo类
class Foo {
    public void sum(int a, int b) {
        System.out.println(a + b);
    }
}

// Foo类的一个实例对象foo
Foo foo = new Foo();

万物皆对象,类也是个对象。fooFoo的实例对象,那么Foo又是谁的实例对象呢?
java.lang.Class的对象。任何一个类都是其对象。

那么,怎么表示这个类的实例对象呢?

// 1. 第一种表示方式 -> 任何一个类都有一个叫class的静态成员变量
Class c1 = Foo.class;

// 2. 第二种表示方式 -> 通过该类的实例对象拿到
Class c2 = foo.getClass;

// 3. 第三种表示方式
Class c3 = Class.forName("com.xu42.java.Foo");

一种通过类的类类型创建类的实例对象的方式

// 可以通过类的类类型(class type)来创建类的实例对象
Foo foo = (Foo) c1.newInstance();//需要Foo拥有无参数的构造方法

java.lang.Class常用的一些方法

// 获取foo实例的public方法(包含父类)
Method[] methods = c2.getMethods();

// 获取foo实例的所有方法(不包含父类)
Method[] methods = c2.getDeclaredMethods();


// 获取foo实例的public成员变量(包含父类)
Field[] fields = c2.getFields();

// 获取foo实例的所有成员变量(不包含父类)
Field[] fields1 = c2.getDeclaredFields();


// invoke
Method method = c2.getDeclaredMethod('sum', int.class, int.class);
method.invoke(foo, 1, 2);

动态加载类与静态加载类

  1. 编译时刻加载类是静态加载类
    通过new创建对象,是静态加载类

  2. 运行时加载类是动态加载类
    Class.forName 是动态加载类