Java反射

1、什么Class类,什么是反射

在Java中,任何一个类都是java.lang.Class类的实例对象,Class类只有Java虚拟机可以new出来。

反射指Java运行时,任意一个类都可以知道这个类的所有属性和方法;对于任意一个对象,都可以调用他的方法和属性,这种动态获取信息和动态调用对象方法的功能机制成为反射机制。

2、Class类的3种动态加载

2.1 getClass()

xxObject obj;
Class c1 = obj.getClass();

2.2 Class.forName("className")

Class c2 = Class.forName("java.util.HashMap");

注意className是类的完全限定名,且可能抛出ClassNotFoundException

2.3 T.class

Class c3 = java.util.HashMap.class;

参考资料:getClass()forName()T.class

----------

java.lang.reflect封装了Constructor,Field,Method等类

3、通过反射获取方法信息

Class c = java.util.HashMap.class;
Method[] methods = c.getDeclaredMethods();//方法(不包括继承的)
c.getMethods();//方法(包括所有继承的)

4、通过反射获取成员变量信息

Class c = java.util.HashMap.class;
Field[] fields = c.getDeclaredFields();//成员变量(不包括继承的)
c.getFields();//成员变量(包括所有继承的)

5、通过反射获取构造函数信息

Class c = java.util.HashMap.class;
Constructor[] constructor = c.getDeclaredConstructors();//构造函数

6、方法反射的操作

method.invoke(方法名字,参数列表);
例如 java.util.Random类有2个重载方法nextInt()和nextInt(int n)

Class c = java.util.Random.class;
Method method0 = c.getMethod("nextInt");//参数列表为空时可以不写参数
Method method1 = c.getMethod("nextInt",new Class[]{});//参数列表为空时使用一个空对象
Method method2 = c.getMethod("nextInt",new Class[]{int.class});
待补充 7、修改成员变量

参考资料:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/package-summary.html

标签: Java, 反射

相关文章推荐: