java反射机制简单总结

1. 什么是反射

简单来说,反射机制是指能够在运行状态中获取任意类的所有属性和方法;
java把一个类也看成一个(Class类的)对象;
利用反射技术可以对一个类进行解剖,把其组成部分(成员方法、成员变量、构造方法等)映射成一个个对象。

2. Class类

假设Foo是一个类(以下讨论都会用到这个类)

Foo foo1 = new Foo();

Foo 这个类也是一个对象,是Class类(java.lang.Class)的实例对象,这个对象我们称为该类的类类型(class type)。

Class类的实例对象有三种表示方式:

Class c = Foo.class; // 任何数据类型(包括基本数据类型)都有一个“静态”成员变量class
Class c2 = foo1.getClass(); // 已知类的对象,通过getClass方法
Class c3 = Class.forName("Foo"); // 常用,通过Class类的静态方法,传入类名

这里c == c2 == c3,即它们是Class类的同一个对象,都是Foo的类类型,在内存中是同一个表示。

Class类的一些常用方法

// 完全可以通过类的类类型创建该类的对象实例
Foo foo = (Foo)c.newInstance(Object... initargs); // 需要有相应参数列表的构造方法

c.getName(); // 获得类的名称,返回String类型
c.getSimpleName(); //不包含包名的类的名称

// java.lang.reflect.Method类,一个成员方法就是一个Method对象
String methodName = m.getName(); // 得到成员方法的名称
Method[] ms = c.getMethods(); // 获取所有的public的函数,包括父类继承而来的
Method[] ms = c.getDeclaredMethods(); // 获取所有该类自己声明的方法,不问访问权限
Method m = c.getMethod("print", int.class,int.class); // 通过名称和参数列表的类类型获取单个方法(有无Delcared与上同理)
//Method m =  c.getMethod("print", new Class[]{int.class,int.class}); // 第二个参数可以是数组形式,也可以是参数列表形式
Method m = c.getDelcaredMethod("print", int.class,int.class);
//Method m =  c.getDeclaredMethod("print", new Class[]{int.class,int.class});


// java.lang.reflect.Field类,一个成员变量就是一个Field对象
Field[] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
Field f = c.getField("name");
Field f = c.getDeclaredField("name");


// java.lang.reflect.Constructor类,一个构造函数就是一个Constructor对象
Constructor[] cs = c.getConstructors(); // 获取所有的public的构造函数
Constructor[] cs = c.getDeclaredConstructors(); // 获取所有(自己声明的)构造函数
Constructor con = c.getConstructor(int.class); // 通过参数列表的类类型,获取单个的public的构造函数(参数同样可以是数组形式)
Constructor con = c.getDeclaredConstructor(int.class); // 获取单个(自己声明的)构造函数

3. Method类的一些常用方法

Class returnType = m.getReturnType(); // 得到方法的返回值类型的类类型
Class[] paramTypes = m.getParameterTypes(); // 获取参数列表类型的类类型
Object o = m.invoke(foo, 10,20); // 方法的反射操作是用m对象来进行方法调用,和foo.print(10, 20)调用的效果完全相同(假设Foo中有这个方法)
//Object o = m.invoke(foo, new Object[]{10,20});

4. Field类的一些常用方法

Class fieldType = f.getType(); // 得到成员变量的类型的类类型
String fieldName = f.getName(); // 得到成员变量的名称
f.set(foo, "value"); // 设置foo中f属性的值

5. Constructor类的一些常用方法

Foo foo = (Foo)con.newInstance(Object... initargs); // 通过构造函数的参数列表调用构造函数

6. 反射的操作都是编译之后的操作

可以在运行时动态加载指定类;
可以通过反射越过泛型检查。

猜你喜欢

转载自blog.csdn.net/Runner1st/article/details/81462423