万物皆对象,关于反射的一些整理。
类与对象
// Foo类
class Foo {
public void sum(int a, int b) {
System.out.println(a + b);
}
}
// Foo类的一个实例对象foo
Foo foo = new Foo();
万物皆对象,类也是个对象。foo
是Foo
的实例对象,那么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);
动态加载类与静态加载类
-
编译时刻加载类是静态加载类
通过new创建对象,是静态加载类 -
运行时加载类是动态加载类
Class.forName 是动态加载类