java反射机制

  • 获取字节码文件的方式:
//获取字节码文件的三种方法:
    一个类可以有很多对象,但只有一个class字节码文件。
Class clazz = Class.forName("com.phone.hack.RefManager");
Class clazz = RefManager.class;
Class clazz = new RefManager().getClass();    
  • 获取构造器对象
//获取公共的构造器对象数组
Constructor<RefManager>[] cons = clazz.getConstructors();
//获取所有的构造器对象数组        
Constructor<RefManager>[] cons = clazz.getDeclaredConstructors();


//获取单个的构造器对象
1、公共无参构造器
Constructor<RefManager> con = clazz.getConstructor();
RefManager ref = con.newInstance();

2、私有有参构造器  

Constructor<RefManager> con = clazz.getDeclaredConstructor(String.class);
con.setAccessible(true);  //关闭访问检查
RefManager ref = con.newInstance("aaaaaa")

3、公共有参构造
Constructor<RefManager> con = clazz.getConstructor(String.class, boolean.class);
RefManager ref = con.newInstance("abcdefg",true);
  • 获取成员变量
//获取公共的成员变量数组
Field[] fields = clazz.getFields();
//获取私有的成员变量数组
Field[] fields = clazz.getDeclaredFields();

1、获取单个公共成员变量isOK
Field field = clazz.getField("isOK");    
boolean bo = (boolean) field.get(ref);  //获取成员变量的值
field.set(ref,true);                    //设置成员变量的值


2、获取单个私有成员变量 str
Field field = clazz.getDeclaredField("str");
field.setAccessible(true);             //必须要设置允许
String str = (String) field.get(ref);  //获取值
field.set(ref,"=======");              //设置值
  • 获取成员方法
Method[] methods = clazz.getMethods();
Method[] methods = clazz.getDeclaredMethods();

1、无参无返回值,公共
Method method = clazz.getMethod("test");
method.invoke(ref);

2、有参无返回值,公共
Method method =  clazz.getMethod("test",String.class);
method.invoke(ref,"00000000");

3、无参有返回值,私有
Method method = clazz.getDeclaredMethod("getTest");
method.setAccessible(true);
String strr = (String) method.invoke(ref);

4、有参有返回值,私有
Method method = clazz.getDeclaredMethod("getTest",String.class);
method.setAccessible(true);
String strrr = (String) method.invoke(ref,"1111111");
  • 获取静态成员变量/方法
//静态成员变量
Field f = clazz.getField("gap");
String sss = (String) f.get(null);      //获取
f.set(null,"11111");                    //设置

//静态成员方法
Method m = clazz.getMethod("print");
m.invoke(null);
  • 反射可以越过泛型检查
List<Integer> array = new ArrayList<>();

array.add("1234");   //报错
//通过反射
Class c = array.getClass();
Method mm = c.getMethod("add",Object.class);

mm.invoke(array,12);
mm.invoke(array,"1234");

String ss = String.valueOf(array.get(1));
  • 反射成员方法中的可变参数
public static void print(int... num){}

//对于这样的可变参数,数据类型是数组
Method m = clazz.getMethod("print",int[].class);
m.invoke(null,new int[]{1});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值