java反射使用总结

java反射使用总结

获取类对象

(1)【Source源代码阶段】 Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
(2)【Class类对象阶段】 类名.class:通过类名的属性class获取
多用于参数的传递
(3)【Runtime运行时阶段】对象.getClass():getClass()方法是定义在Objec类中的方法
多用于对象的获取字节码的方式
注意:同一个字节码文件在一次程序运行过程中,只会被加载一次,无论通过哪一种方式获取的Class对象都是同一个。
代码如下所示:

//方法一:Class.forName("全类名")
Class cl1 = Class.forName("cn.buptleida.database.RedisDB");
System.out.println(cl1);

//方法二:类名.class
Class cl2 = RedisDB.class;
System.out.println(cl2);

//方法三:对象.getClass()
RedisDB obj = new RedisDB();
Class cl3 = obj.getClass();
System.out.println(cl3);

成员变量方法

获取

Class cl = SDS.class;
//根据变量名称获取成员变量Field对象,只允许public修饰的变量
Field field = cl.getField("len");

//获取所有public修饰的成员变量
Field[] fields = cl.getFields();

//根据名称获取成员变量,不考虑修饰符
Field declaredField = cl.getDeclaredField("len");

//获取所有成员变量,不考虑修饰符
Field[] declaredFields = cl.getDeclaredFields();

使用

//需要传入一个实例化的对象
SDS sds = new SDS(new char[]{'h','e','l','l','o'});

//暴力反射,忽略访问控制权限
declaredField.setAccessible(true);

//获取成员变量的值
Object o = declaredField.get(sds);

//设置成员变量的值
declaredField.set(sds,6);

构造方法

获取

Constructor constructor = cl.getConstructor(char[].class, int.class);
Constructor[] constructors = cl.getConstructors();

Constructor declaredConstructor = cl.getDeclaredConstructor(char[].class, int.class);
Constructor[] declaredConstructors = cl.getDeclaredConstructors();

使用

空参构造方法

//方法一
Constructor constructor = cl.getConstructor();
Object objSds = constructor.newInstance();
//方法二
Object objSds = cl.newInstance();

非空参构造方法

Constructor constructor = cl.getConstructor(char[].class, int.class);
Object objSds = constructor.newInstance(new char[]{'h', 'e', 'l', 'l', 'o'},10);

方法对象

获取

Method method = cl.getMethod("getBuf");

Method[] methods = cl.getMethods();

//方法如果带参数,则写上参数列表
Method declaredMethod = cl.getDeclaredMethod("makeRoom", int.class);

Method[] declaredMethods = cl.getDeclaredMethods();

使用

//需要传入一个实例化的对象
SDS str = new SDS(new char[]{'h', 'e', 'l', 'l', 'o'});
method.invoke(str);

declaredMethod.setAccessible(true);
declaredMethod.invoke(str,3);

其它

getName方法

String name1 = declaredField.getName();
String name2 = constructor.getName();//返回全类名
String name3 = declaredMethod.getName();
String name4 = cl.getName();//返回全类名
posted @ 2020-07-17 16:51  数小钱钱的种花兔  阅读(136)  评论(0编辑  收藏  举报