当前位置: 首页 > 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.gsyq.cn/news/73611.html

相关文章:

  • 子弹射击
  • 安装Vivado
  • 解码类进阶核心——静态成员、this 指针、动态内存与友元机制
  • VIVADO 2023.2 license 可使用至2037年文件备份
  • 2025年度总评:国潮花灯生产厂商终极榜单发布,天幕花灯/春节花灯/古镇花灯/智能花灯/互动花灯/营销花灯/大型花灯花灯供货厂家排行榜单
  • ai生成一段学习golang的select、context、go、channel的代码
  • 背离
  • 银河麒麟V10 申威架构 docker-compose rpm 包安装教程(附命令)
  • 【Linux】服务器开启 ssh 服务 ssh 相关配置
  • 2025 省选 炼石计划 梦熊模拟赛 记录
  • SFT微调
  • 讲一讲 Transformer 在脑电 EEG 里的作用
  • 贪心算法之: 田忌赛马
  • 49
  • 小游戏联机服务开发实践:从零构建房间匹配与帧同步系统
  • PbootCMS登录失败:数据库目录写入权限不足!
  • pbootcms后台公司信息的内容如何调用到前台页面上
  • Day56(26)-F:\vs_ai_work\vue-tlias-management\vue-tlias-management\src\views\layout\index.vue
  • AI Agent 设计原则与最佳实践
  • 深入解析:HiTooler File Finder: macOS上速度碾压Spotlight,媲美Windows上「Everything」的文件搜索神器
  • 2025年高倍率应急启动电源生产厂家推荐与联系指
  • 错过
  • 12.5
  • 2025年迈腾更换轮胎推荐:十大轮胎品牌官方指南
  • java-pta-代码
  • 帝国cms升级时提示Table ***_enewsdtuserpage already exists
  • chroot使用
  • 街头徒手健身1引体向上
  • 2025年比亚迪唐更换轮胎推荐:最新轮胎评测深度报告
  • 第二章 硬件架构