决战圣地玛丽乔亚Day36
反射的用法和场景:
1.newInstance()创建对象:
首先需要获取类对象 Class class = Entity.class
获取class后,创建对象可以通过:
Entity entityclass = (Entity)class.newInstance() 进行对象的创建
如果类有自己的构造器,也可以通过构造器去创建对象
获取构造器 Entity.getConstructor()获取构造器后调用newInstance
Class jueJinUserClass = JueJinUser.class;
Constructor constructor = jueJinUserClass.getConstructor();
JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();
tips:使用构造器的方式创建对象,可以使用无参构造和有参构造,比较灵活,使用类的newInstance只能是无参
2.获取反射对象
根据类路径使用Class.forName:
Class className = Class.forName("com.dwj.xxxxx")
.class:
Class className= EntityClass.class
getClass:
User user = new User ();
Class userClass = user.getClass();
3.获取类的属性
获取类后可以通过调用 .getFields和.getDeclaredFields方法获取
4.获取类中的构造方法
获取类后通过clz.getConstructors()和clz.getDeclaredConstructors方法进行获取构造方法
5.获取类中的方法
获取类后通过clz.getMethods()和clz.getDeclaredMethods方法进行获取构造方法
反射的性能:
反射的性能问题和使用次数有关,如果不是大量使用多次,性能是没问题的。
- 不要过于频繁地使用反射,大量地使用反射会带来性能问题;
- 通过反射直接访问实例会比访问方法快很多,所以应该优先采用访问实例的方式。
反射的安全性问题:
绕过访问控制:Java反射可以绕过对象的访问控制机制,即使对象的方法和属性被设置为私有也可以访问。这可能会导致程序员意外地允许未经授权的访问和操作对象,可能会导致程序中的潜在漏洞。
注入攻击:Java反射可以通过动态生成代码来调用对象的方法,因此可能会被用于注入攻击。例如,恶意代码可能会利用反射机制来执行非法代码或修改数据。
恶意代码注入:恶意代码可以利用Java反射机制来动态加载类并执行其中的方法。这可能会导致程序执行未经授权的操作,并可能导致系统被攻击。
暴露敏感信息:Java反射可以读取和操作对象的私有成员和方法,因此可能会导致程序员意外地泄露敏感信息。
绕过安全检查:Java反射可以绕过Java安全管理器的检查,因此可能会允许程序执行特权操作。
反射的使用场景:
动态加载类:Java反射可以动态地加载类,以便程序可以在运行时加载所需的类。这对于开发框架和插件系统非常有用。
运行时类型检查:Java反射可以让程序在运行时检查对象的类型和属性,这对于开发泛型代码和操作未知类型的对象非常有用。
访问私有成员:Java反射可以访问和操作对象的私有成员,包括私有方法、字段和构造函数。这对于开发测试工具和调试器非常有用。
动态代理:Java反射可以用于实现动态代理,允许程序在运行时创建一个代理对象来代替原始对象执行操作。这对于开发AOP框架和RPC系统非常有用。
序列化和反序列化:Java反射可以用于序列化和反序列化Java对象,即将对象转换为字节流,并在需要时将其还原为原始对象。这对于开发网络通信和持久化系统非常有用。
自定义注解和处理器:Java反射可以用于创建和处理自定义注解,并且可以在运行时动态地解析注解信息。这对于开发框架和库非常有用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
2017-03-20 线程和并发--简介