java反射机制

122 阅读2分钟

Class类主要API

成员变量:getFields()、getDeclaredFields()
成员方法:getMethods()、getDeclaredMethods()
构造方法:getConstructors()、getDeclaredConstructors()

第一个API只返回这个类及其超类的公有变量(方法)的数组,
第二个API返回这个类的全部变量(方法)的数组。

Field[] fields = c1.getDeclaredFields();
Mwthods[] methods = c1.getDeclaredMethods();
Constructors[] constructors = c1.getDeclarConttuctors();

一、获取Class类对象的途径

1、ect类的getClass()方法

Object类中的getClass()方法将会返回一个Class类型的实例。

Employee e;
...
Class c1 = e.getClass();
System.out.println(c1.getName()+":"+e.getName());
//此时c1就是该类的对象
//印出 Empoyee:Harry Hacker

2、结构静态属性class

若T代表任意Java类型,则T.class将代表匹配的类对象。

Class c1 = Random.class;
Class c2 = int.class;
Class c3 = Double[].class;

3、ass类的静态方法:public static Class ForName(String className)

调用静态方法forName()获取类名对应的Class对象
如果类名保存在字符串中,并可能在运行中改变,就用这个方法;字符串中不是类名或接口名,就会抛出错误。

String s = "java.util.Random";
Class c1 = Class.forName(s);
//此时c1就是该类的对象

二、获取成员变量并使用

1: 获取Class对象
2、通过Class对象获取Constructor对象
3Object obj = Constructor.newInstance()创建对象
4、Field field = Class.getField("指定变量名")获取单个成员变量对象
5、field.set(obj,"xxx") 为obj对象的field字段赋值xxx

如果需要访问私有private或者默认修饰的成员变量
1Class.getDeclaredField()获取该成员变量对象
2、setAccessible() 暴力访问           

调用成员方法

1、获取Class对象
2、通过Class对象获取Constructor对象
3、Constructor.newInstance()创建对象
4、通过Class对象获取Method对象:getMethod("方法名");
5、Method对象调用invoke方法实现功能

如果调用的是私有方法那么需要暴力访问
1getDeclaredMethod()
2setAccessiable();