java反射--记录

本文介绍了Java反射机制的基本使用方法,包括如何通过Class.forName获取Class对象并创建实例,以及如何使用Class对象提供的方法来获取和调用类的方法及字段。

今天复习了下java的反射,大致内容为 通过class.froname得到class对象。通过class对象提供的newInstance方法获得class对象的实例,此时已经初始化了目标类。

在通过Class 实例提供的getMethods,getFields 等方法获取方法或者属性进行操作。


1. Class c = Class.forName("**.**.ClassName");

2. Object obj = c.newInstance();

3. Method[] m = c.getDeclaredMethods(); //获取所有定义了的方法,包括private method

Method m = c.getDeclaredMethod("methodName",Class[] types);//可以通过方法名,方法参数类型获取具体的method

Field[] f = c.getDeclaredFields(); // 获取所有声明了的 属性 包括 private


4. m.invoke(obj,prams); //调用方法,注意若调用的方法为private 的 ,需要设置 允许访问 m.setAccessible(true);

prams 为Object[] 传入方法的参数

5 m.invoke返回的为Object 对象

### Java反射高级特性与最佳实践 #### 反射概述 Java反射机制允许程序在运行时动态地获取类的信息并对其进行操作。这包括但不限于创建对象、访问和修改字段、调用方法等功能[^1]。 #### 动态获取类信息 通过`java.lang.Class`可以实现对任意类型的自省,即查询其结构特征而不必事先知道具体的类型名称。例如: ```java // 获取Class实例的方式之一:已知对象的情况下 Object obj = new String(); Class<?> clazz = obj.getClass(); // 或者直接指定类型名来获得对应的Class对象 Class<String> stringClass = String.class; ``` #### 字段访问与设置 能够读取或更改私有属性的值是一项强大的功能,在某些情况下非常有用,比如单元测试或者ORM框架内部逻辑实现中。下面是一个简单的例子展示如何做到这一点: ```java Field privateStringField = MyClass.getDeclaredField("privateFieldName"); privateStringField.setAccessible(true); // 打开权限以便后续操作 privateStringField.set(myInstance, "new value"); // 设置新值给该字段 ``` #### 方法调用 除了基本的数据成员外,还可以借助于`Method`类来进行函数级别的交互。这里给出一段示范代码片段用于说明怎样执行静态方法以及带参数的方法调用过程: ```java // 调用无参构造器创建新的实例 Constructor<MyClass> constructor = myClass.getConstructor(); MyClass instance = constructor.newInstance(); // 查找特定签名的方法定义 Method methodWithArgs = myClass.getMethod("methodName", int.class); methodWithArgs.invoke(instance, 42); // 带有一个整数参数的方法调用 ``` #### 泛型支持下的反射运用 当涉及到带有泛型声明的对象时,则需要额外注意一些细节问题。因为擦除机制的存在使得编译后的字节码丢失了大部分有关泛型的具体信息。不过仍然可以通过TypeToken等方式绕过这些限制从而更好地兼容各种复杂情况[^2]。 #### 安全性和性能考量 虽然反射带来了极大的灵活性,但也伴随着一定的代价——它可能会降低应用程序的整体效率,并且如果滥用的话还可能引发安全隐患。因此建议仅限于确实必要的场合下才考虑采用此技术手段;同时遵循官方文档推荐的做法以减少潜在的风险因素[^3]。 #### 实际应用场景举例 - **AOP编程**: 利用拦截器模式增强目标行为之前/之后的行为。 - **依赖注入容器(DI/IoC)**: 自动装配组件之间的协作关系。 - **JSON/XML解析库**: 将外部格式转换成内存表示形式。 - **数据库持久层工具(ORM)**: 映射实体到表记录之间相互转化的过程。 #### 类卸载的重要性 对于那些频繁加载不同版本的第三方模块或是基于插件架构构建的产品来说,确保及时释放不再使用的资源至关重要。尤其是在JVM配置不当的时候容易遇到PermGen space不足的问题,此时开启-Xnoclassgc选项可以帮助缓解此类状况的发生频率[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值