java 浅谈反射在实际场景中应用

  • Post author:
  • Post category:java


反射通常使用场景

1、动态生成对象,应用于工厂模式中

2、应用于动态监听jar包代码或者无法改变代码中内容

(1)直接获取对象属性,并重现建立指向关系型反射

(2)通过类接口,进行重新设定引用,但只监听接口方法型反射

===

浅谈一下第二种的内容的理解

  private void intRefect()
    {
//获取Class
            Class<?> className = Class.forName("");
            //也可以用 类名.getClass();形式,这里adc是属性名称
            Field field = className.getDeclaredField("adc");
            //注意设置 才可以执行调用
            field.setAccessible(true);
            //field如果是静态变量可以下面这样来实现 重新建立对象指向关系
            //相当于对adc属性赋值
            field.set(null,对应field相应类型的对象);
            //field如果是静态变量,可以下面这样,获取此对象
            //相当于获取此adc属性的值
           Object object = field.get(null);

            //field不是静态变量的时候,则需要传递field属性所在的类的对象实例
            field.set(对象实例,对应field相应类型的对象);
            //从对象实例中,获取field名称的对象
            field.get(对象实例);

//对于获取的某些属性对象是 **容器** 或者 **通用类形式**,我们则可以直接调用其内部方法!!!比较简便

            //对于方法的调用
            Method method = className.getDeclaredMethod("方法名");
            //静态方法可以
            Object objectRet = method.invoke(null,参数或者无参数(Object[])null);
//            或者对于无参数静态方法可以这样调用
            Object objectRet1 = method.invoke(null);
            //非静态方法可以
            Object objectRet2 = method.invoke(具体的对象实例,参数或者无参数(Object[])null);



            //对于接口代理,并添加额外操作的实现
            /**
             * 条件是
             * 1、需要获取此对象
             * 2、我们想要 来对此对象实现的接口方法,添加额外操作
             * 需要做的内容是
             * 根据已有此对象,重新进行new一个代理对象,并设置引用关系
             */
        //假设传入的对象为objectInstance
            Object objectInstance= new Object();
           final Object instanceProxy;
            instanceProxy = Proxy.newProxyInstance(objectInstance.getClass().getClassLoader(),objectInstance.getClass().getInterfaces(),new MyHandlerInvocation(objectInstance));
     //将我们重写建立的 新的属性  设置到  object中,,,即之前object对象中有一个       
     // objectInstance对象,后面我们改成 我们设置了监听的对象  instanceProxy
            field.set(object,instanceProxy);





    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    private static class MyHandlerInvocation implements InvocationHandler

    {
        //指向被代理对象
        private  Object object;
          public MyHandlerInvocation(Object object)
          {
              this.object = object;
          }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //添加额外操作

            //之后也要将代理操作执行
            Object retObject = method.invoke(this.object,args);
            return retObject;
        }
    }



版权声明:本文为u011523180原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。