
JAVA反射机制实例
发布日期:2021-05-08 13:47:48
浏览次数:30
分类:精选文章
本文共 1672 字,大约阅读时间需要 5 分钟。
反射API在Java中是一个强大的工具,能够允许我们在运行时对类、对象、方法和属性进行动态操作。以下将通过实际案例,详细介绍如何使用反射API来实现动态加载类、创建对象、调用方法以及访问和修改属性。
动态加载类
反射API提供了两种主要方式来动态加载类:通过类对象和类名。
方法一:通过类对象获取类
Object o1 = new Test2();Class cls = o1.getClass();System.out.println("cls:" + cls);
这里,我们通过o1.getClass()
动态获取Test2
类的类对象。这个方法简单直观,适用于已知对象的情况。
方法二:通过类名动态加载类
String className = "test.Test2";Class cls = Class.forName(className);System.out.println("cls:" + cls);
通过Class.forName(className)
方法,我们可以根据类名动态加载特定类。这种方法在类名明确的情况下更加灵活。
动态创建对象
在使用反射API创建对象时,需要确保目标类有无参数构造器。以下是一个典型的实现:
Object obj = cls.newInstance();
动态调用对象方法
反射API提供了多种方法来获取和调用对象的方法。
获取特定方法
Method method = cls.getDeclaredMethod("test2", int.class);System.out.println("method:" + method);
获取所有方法
Method[] methods = cls.getDeclaredMethods();System.out.println("methods:" + methods);int index = 0;for (Method m : methods) { System.out.println("method[" + (index++) + "]:" + m);}
动态方法调用
method.setAccessible(true);method.invoke(obj, 1);
动态访问和修改对象属性
反射API同样支持对对象属性的动态操作。
获取特定属性
Field field = cls.getDeclaredField("param");System.out.println("field:" + field);
获取所有属性
Field[] fields = cls.getDeclaredFields();System.out.println("fields:" + fields);int index = 0;for (Field f : fields) { System.out.println("field[" + (index++) + "]:" + f);}
动态属性修改
field.setAccessible(true);Object param = field.get(obj);System.out.println("param_1:" + param);field.set(obj, 3);System.out.println("param_2:" + field.get(obj));
注意事项
反射API虽然提供了强大的功能,但也伴随着一定风险。例如,调用非公方法可能会抛出SecurityException
,调用非实例方法可能会抛出NoSuchMethodException
等。因此,在使用反射API时,需要确保方法和属性的访问权限是可控的,并在必要时设置相应的访问控制。
总结
通过以上示例,我们可以看到反射API在动态加载类、创建对象、调用方法和访问属性方面的强大功能。然而,随着对反射API的深入使用,开发者需要注意潜在的安全隐患,并合理使用反射功能,以避免对代码的可维护性和安全性产生负面影响。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月01日 16时35分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Go 数组&切片
2019-03-06
Go 文件操作
2019-03-06
老Python总结的字典相关知识
2019-03-06
vue 不常见操作
2019-03-06
jQuery的事件绑定与触发 - 学习笔记
2019-03-06
Python处理接口测试的签名
2019-03-06
测试流程规范--测试报告模板
2019-03-06
Linux上TCP的几个内核参数调优
2019-03-06
记一次讲故事机器人的开发-我有故事,让机器人来读
2019-03-06
高德算法工程一体化实践和思考
2019-03-06
重温网络编程——常识(三)
2019-03-06
判断一个数是否是2的幂
2019-03-06
js 闭包(新)
2019-03-06
vscode 编辑python 如何格式化
2019-03-06
seo 回忆录百度基本概念(一)
2019-03-06
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
2019-03-06
用ThreadLocal来优化下代码吧
2019-03-06
netcore中使用session
2019-03-06
Android 开发学习进程0.25 自定义控件
2019-03-06