初学java反射机制
来源:互联网 发布:数据黑产吧 编辑:程序博客网 时间:2024/06/06 14:18
何为反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单来说就是通过反射机制,我们可以很灵活的去调用java代码。
废话不多说。直接上代码
package core;import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 描述 * @author Faker Li * @created 2016年5月27日 上午11:01:52 */public class ReflectionUtil { /** * 得到某个对象的公共属性 * * @param owner, fieldName * @return 该属性对象 * @throws Exception * */ public Object getProperty(Object owner, String fieldName) throws Exception { Class ownerClass = owner.getClass(); Field field = ownerClass.getField(fieldName); Object property = field.get(owner); return property; } /** * 得到某类的静态公共属性 * * @param className 类名 * @param fieldName 属性名 * @return 该属性对象 * @throws Exception */ public Object getStaticProperty(String className, String fieldName) throws Exception { Class ownerClass = Class.forName(className); Field field = ownerClass.getField(fieldName); Object property = field.get(ownerClass); return property; } /** * 执行某对象方法 * * @param owner * 对象 * @param methodName * 方法名 * @param args * 参数 * @return 方法返回值 * @throws Exception */ public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { Class ownerClass = owner.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(owner, args); } /** * 执行某类的静态方法 * * @param className * 类名 * @param methodName * 方法名 * @param args * 参数数组 * @return 执行方法返回的结果 * @throws Exception */ public Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception { Class ownerClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(null, args); } /** * 新建实例 * * @param className * 类名 * @param args * 构造函数的参数 * @return 新建的实例 * @throws Exception */ public Object newInstance(String className, Object[] args) throws Exception { Class newoneClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Constructor cons = newoneClass.getConstructor(argsClass); return cons.newInstance(args); } /** * 是不是某个类的实例 * @param obj 实例 * @param cls 类 * @return 如果 obj 是此类的实例,则返回 true */ public boolean isInstance(Object obj, Class cls) { return cls.isInstance(obj); } /** * 得到数组中的某个元素 * @param array 数组 * @param index 索引 * @return 返回指定数组对象中索引组件的值 */ public Object getByArray(Object array, int index) { return Array.get(array,index); } }
通过ReflectionUtil 可以获取方法中的属性值和调用想要调用的函数
测试函数如下:
package test;import core.ReflectionUtil;import core.service.TestService;import core.service.impl.TestServiceImpl;/** * 描述 * @author Faker Li * @created 2016年5月27日 上午11:05:40 */public class ReflectionTestUtil { public static void main (String[] args)throws Exception { ReflectionUtil reflectionUtil = new ReflectionUtil(); Class onwClass = Class.forName("core.model.Test"); Object bean = onwClass.newInstance(); Object object = reflectionUtil.getProperty(bean, "username"); System.out.println(object);//输出 lij //调用TestServiceImpl.getPassWord方法 reflectionUtil.invokeStaticMethod("core.service.impl.TestServiceImpl", "getPassWord",new Object[]{});//输出 password:123456 Class onwClass1 = Class.forName("core.service.impl.TestServiceImpl"); Object bean1 = onwClass1.newInstance(); //调用TestServiceImpl.getUser方法 reflectionUtil.invokeMethod(bean1, "getUser",new Object[]{"faker"});//输出username:faker //调用TestServiceImpl.getUser方法 reflectionUtil.invokeMethod(bean1, "getUser",new Object[]{"lij","234567"});//输出username:lij,password:234567 Object testServiceImpl = reflectionUtil.newInstance("core.service.impl.TestServiceImpl",new Object[]{}); TestServiceImpl service = (TestServiceImpl) testServiceImpl; service.getUser("lij");//输出 username:lij service.getPassWord();//输出 password:123456 }}
代码解释就不说了,动手实践看效果才会学的更快
学会了java的反射机制能使我们更灵活的去开发项目或者封装一些底层代码
以上只是个人对java反射的认识,有错误的地方或者更好的意见,欢迎一起探讨。
0 0
- 初学java反射机制
- java 反射机制初学习
- Java初学习-Java的反射机制
- Java中的反射机制(初学)
- Java初学习 - 反射机制1
- Java初学习 - 反射机制2
- java_web初学笔记之<java的反射机制>
- 初学Java的类加载与反射机制(一)
- 初学Java的类加载与反射机制(二)
- java反射初学
- java反射初学整理
- 【反射】JAVA反射机制
- java-反射初学(1)
- java-反射初学(2)
- Java反射技术初学习
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Apache服务器最新版下载、安装及配置(win版
- Android调用系统分享直接抵达微信
- 杂的文
- Codeforces Round #352 (Div. 2) A.Summer Camp
- 安装win7、windows server 2012 出现无法配置在此计算机硬件上运行 解决方案
- 初学java反射机制
- 使用logstash+elasticsearch+kibana快速搭建日志平台
- 1.2.21 Map.values方法——获取Map集合中的所有键值对象
- SpringMVC开发笔记
- 2016/5/27 1004. 简单减法
- Qt之自定义布局管理器(QCardLayout)
- 通过命令的方式实现计算机定时关机
- sas:主成分分析
- 自制Camera例子——相机效果