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

Java中的反射

反射:可以在运行时动态获取类和对象的信息,调用对象的属性和方法的机制。

优缺点:
优点:代码更加灵活。
缺点:性能稍差;安全问题,可以⽆视泛型参数的安全检查。

java.lang.reflect 反射
Member 接口 - 反映关于单个成员(字段或方法)或构造函数的标识信息。
Field 类 - 提供一个类的域的信息以及访问类的域的接口。
Method 类 - 提供一个类的方法的信息以及访问类的方法的接口。
Constructor 类 - 提供一个类的构造函数的信息以及访问类的构造函数的接口。
Array 类 - 该类提供动态地生成和访问 JAVA 数组的方法。
Modifier 类 - 提供了 static 方法和常量,对类和成员访问修饰符进行解码。
Proxy 类 - 提供动态地生成代理类和类实例的静态方法。

**常用Field 类、Method 类、Constructor 类
**注意Class类中方法对私有属性、私有方法、私有构造方法的支持差异。

1.Class类对象:
被反射类对应的Class对象。Java中,类的所有实例化对象都会有一个对应的Class类对象.class 。 Class类对象由Jvm生成(保存在元数据区metaspace),可以通过它获取整个类的结构,
Class类是反射的基础,java.lang.Class是所有反射API的入口。
注:一个类有且仅有一个Class类对象。
可以通过Class类对象class获取操作类的Field类对象、Method类对象、Constructor 类对象等等。

1.1 获取Class类对象.class的三种方法:
a.java.lang.Class中的forName静态方法
使用类的完全限定名来获取类对象,应用场景:JDBC开发加载数据库驱动。
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
b.类直接获取类的Class类对象
Class clazz = HashMap.class
c.实例对象object调用Object的getClass()方法
GarfieldCat garfieldCat = new GarfieldCat();
Class clazz = garfieldCat.getClass();

1.2 通过反射创建类的实例化对象两种方法:
a.Class类对象的newInstance方法
GarfieldCat cat = (GarfieldCat)GarfieldCat.class.newInstance();
b.Constructor类对象的newInstance方法
Constructor constructor = GarfieldCat.class.getConstructor(Class<?>... parameterTypes);//参数的类型
GarfieldCat cat = (GarfieldCat)constructor.newInstance();

1.3 判断是否为某个类的实例的两种方法:
a.instanceof关键字
for(garfieldCat instanceof GarfieldCat){...}
b.Class类对象的isInstance方法(一个Native方法)
for(GarfieldCat.class.isInstance(garfieldCat)){...}

2.Field类对象
2.1 Class类对象获取Field类对象的方法:
a.getField
获取类中public类成员,可以获取父类的类成员
b.getDeclaredField
根据名称获取已声明的类成员,包括私有属性,但无法获得父类的类成员
c.getFields
获取所有public类成员(包括类成员常量),数组存储
d.getDeclaredFields
获取所有已声明的类成员,包括私有属性,数组存储

例子,获取对象的私有类成员,包括类常量
Field[] fields = clazz.getDeclaredFields(); //获取所有类成员
fields.setAccessible(True);//解除私有变量访问权限,将对象的私有属性和方法设置为允许访问
for(String str : fields){//变量获取所有类成员
...//对类成员操作
//set(object,newObject);//将实例化对象中的私有类成员变量值替换为新值
//.get(obj);根据常量名获取私有常量值
};

3.Method类对象
3.1 Class类对象获取Method类对象的方法://Declared公开的 注意对public和private方法的异同
a.getMethod(String name, Class... parameterTypes) 返回类或者接口的特定公开public方法,name为方法名称,如果方法带参,则Class... parameterTypes为方法参数对应的Class类对象;可以获取父类的方法。
b.getDeclaredMethod(String name, Class<?>... parameterTypes)
返回类或者接口的特定方法,包括私有方法;但无法获取父类方法。
c.getMethods()
返回所有类或者接口的特定公开public方法。
d.getDeclaredMethods()
返回所有类或者接口的特定方法,包括私有方法。

例子,获取对象的私有方法。
//获取私有成员方法
Method method = clazz.getDeclaredMethod("catchMouse", String.class);
//解除私有权限
method.setAccessible(true);
//执行私有方法,第一个参数为实例化对象,后面参数为方法参数
System.out.println(method.invoke(garfieldCat, "jerry"));

4.Constructor类对象
4.1 Class类对象获取Constructor对象的方法: 与Field、Method类似,注意public和private的支持。
a.getConstructor
返回类的特定 public 构造方法。参数为方法参数对应 Class 的对象。
b.getDeclaredConstructor
返回类的特定构造方法,包括private。参数为方法参数对应 Class 的对象。
c.getConstructors
返回类的所有 public 构造方法。
d.getDeclaredConstructors
返回类的所有构造方法,包括private。

例子,获取构造方法:
//获取构造方法
Constructor constructor = clazz.getConstructor();
GarfieldCat cat = (GarfieldCat) constructor.newInstance();
System.out.println(cat.eat());

5.反射的应⽤场景
5.1 反射在Spring/Spring Boot、MyBatis等框架中大量使用。
5.2 JDK动态代理
通过反射 Method 来调⽤指定的⽅法。
5.3 注解
通过反射获取到类/属性/⽅法/⽅法的参数上的注解。

🔺反射为什么慢?
动态性:反射是在运行时动态地获取类的信息并进行操作,而直接调用方法或访问字段是在编译时确定的,因此反射需要额外的运行时开销来解析类结构、查找方法或字段等。
安全检查: 反射会进行一些安全性检查,例如权限检查、访问控制检查等,以确保代码的安全性。这些额外的安全检查会增加反射操作的开销。

http://www.jsqmd.com/news/63054/

相关文章:

  • 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案(或者说使用缓存的过程中有没有遇到什么问题,怎么应对的)
  • 12月5日总结 - 作业----
  • Markdown 使用教程
  • 2025年行业内排行前列的清障车源头厂家推荐排行榜单,黄牌清障车/前四后八平板拖车/8吨清障车/重载清障车/二手拖车清障车企业口碑推荐
  • 参与GenAI黑客马拉松六个月的实战心得
  • 写给自己看,自己写自己
  • MySQL性能优化
  • 2025.12.5——1蓝
  • 子弹射击
  • “我爱你,也讨厌你。”—— 一位研究者与他的AI伙伴的创作随想
  • 2025年现浇楼板施工验收标准排行,你家合格吗?混凝土现浇/钢筋混凝土现浇/现浇楼梯/现浇楼板现浇楼板多少钱一平推荐榜单
  • 安装Vivado
  • GoldenDB数据库工程师培训(中兴GoldenDB金融级/运营商级分布式数据库) 原创
  • 有关通过解密查看文章这件事
  • 解码类进阶核心——静态成员、this 指针、动态内存与友元机制
  • 2025年防雨棚厂家供应排行榜,热门联系电话汇总,控制台定做/龙门架监控杆/指挥中心控制台/防雨套/防雨棚生产厂家推荐榜
  • VIVADO 2023.2 license 可使用至2037年文件备份
  • 在windows下启用vscode进行cuda编程
  • XXE盲注 感受创造之美
  • DML数据操作语言
  • Rustup 暂时切换国内源并更新
  • 【完整源码+数据集】蓝莓数据集,yolo11蓝莓成熟度检测数据集 3023 张,蓝莓成熟度资料集,目标检测蓝莓识别算法系统实战教程
  • 2025年货架批发厂家口碑推荐TOP5,贯通货架/托盘货架/组合式货架/牛脚式货架/穿梭式货架/仓库存储货架源头厂家推荐
  • 2025年度总评:国潮花灯生产厂商终极榜单发布,天幕花灯/春节花灯/古镇花灯/智能花灯/互动花灯/营销花灯/大型花灯花灯供货厂家排行榜单
  • 深度学习:python人脸表情识别系统 情绪识别系统 深度学习 神经网络CNN算法 ✅ - 指南
  • CSAPP Archlab
  • 2025年ISO认证服务满意度排行榜TOP5揭晓,ISO9001/ISO认证ISO认证代办费用
  • ai生成一段学习golang的select、context、go、channel的代码
  • 背离
  • 2025/12/5 今天学gemini的day1 lecode1和26等