初学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
原创粉丝点击