当前位置: 首页 > news >正文

java 反射

总结一下,方便自己查看
按照步骤来:
获取class对象,然后实例化,然后调用实例化对象的哪一个方法或者得到他的哪一个变量。

文章目录

  • 1. 获取class对象
  • 2. 获取方法和字段
  • 3.调用方法、获取字段值
  • 4.举例
    • 反射获取unsafe对象

1. 获取class对象

三种:

Class<?> clazz = Class.forName("com.example.MyClass");
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
Class<?> clazz = MyClass.class;

2. 获取方法和字段

api差不多,也可以获取注解等

Field field = clazz.getDeclaredField("xx);
Method get = clazz.getDeclaredMethod("get");

3.调用方法、获取字段值

调用前设置可以访问:field.setAccessible(true)或method.setAccess(true),否则会报错。
调用方法、获取字段值需要实例化对象。

   Constructor<?> privateConstructor = clazz.getDeclaredConstructor();privateConstructor.setAccessible(true);// 调用构造方法实例化Object instance = privateConstructor.newInstance();// 调用方法Method method = clazz.getMethod("methodName", String.class, int.class);Object result = method.invoke(instance, "param1", 123);// 获取字段值Field privateField = clazz.getDeclaredField("privateFieldName");privateField.setAccessible(true);Object value = privateField.get(instance);

如果是静态变量,就不需要实例化对象了。

4.举例

反射获取unsafe对象

unsafe对象不能随便使用。要使用必须反射获取。

class MyClass {private int state = 0;private static final long stateOffset;private static final Unsafe unsafe;static {try {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);// 因为是静态变量,不需要实例化unsafe = (Unsafe)theUnsafe.get(null);// 获取MyClass中state变量的地址stateOffset = unsafe.objectFieldOffset(MyClass.class.getDeclaredField("state"));} catch (Exception e) {throw new Error(e);}}public static void main(String[] args) throws Exception{MyClass myClass = new MyClass();System.out.println(myClass.state);boolean b = unsafe.compareAndSwapInt(myClass, stateOffset, 0, 1);if (b) {System.out.println(myClass.state);}}
}

unsafe源码。
我们程序的classloader自然是appclassloader,所以会抛出异常。

  @CallerSensitivepublic static Unsafe getUnsafe() {Class var0 = Reflection.getCallerClass();if (!VM.isSystemDomainLoader(var0.getClassLoader())) {throw new SecurityException("Unsafe");} else {return theUnsafe;}}

http://www.mrgr.cn/news/17111.html

相关文章:

  • Docker 容器编排之 Docker Compose
  • 数据结构--带头双向循环链表
  • asp.net实验:数据库写入不成功
  • Java、python、php版 保险业务管理与数据分析系统 社会保险档案管理系统(源码、调试、LW、开题、PPT)
  • ubuntu20.04 colmap安装
  • JavaWeb JavaScript ⑨ 正则表达式
  • spring -- AOP详解
  • 如何实现一个通用的接口限流、防重、防抖机制
  • Nginx 维护与应用:最佳实践
  • 前端宝典二十一:前端异步编程规范手写Promise、async、await
  • Python Chardet介绍
  • 重塑未来:碳捕集与存储(CCS)的革命性突破与可持续发展路径
  • 大模型目录
  • 用技术手段冲击市场,上海破获特大操纵期货市场案
  • 菜鸟教程002 目标对象的中心点与源对象的中心点对齐,获取对象中心坐标
  • 电池点焊机设计要点记录及个人分析
  • 音视频解码 AVIO内存输入模式
  • 力扣452-用最少数量的箭引爆气球(Java详细题解)
  • vulnhub靶场-DC2
  • 企业邮箱申请步骤