JAVA动态代理

2017-12-08  本文已影响22人  蒸汽飞船

部分代码

  ...略...
  public static class B{
        String name;
        public B(String name) {
            this.name = name;
        }
    }

    public interface BlogService {
        CR<B> getKeys( String cityId);
    }

    public static  <T> T create(final Class<T> service) {
        return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Type type = method.getGenericReturnType();
                say(type.toString());

                CR<B> cr = new CR<>();
                cr.data = new B("bbb");

                return cr;
            }
        });
    }


    public static void main(String[] ar){
        BlogService bs = create(BlogService.class);
        CR<B> cr = bs.getKeys("d");
    }
    ...略...

java.lang.reflect.Proxy:

动态代理机制的主类,提供一组静态方法为一组接口动态的生成对象和代理类。

// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器
public static InvocationHandler getInvocationHandler(Object proxy) 

// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象
public static Class<?> getProxyClass(ClassLoader loader, 
Class<?>... interfaces)

// 方法 3:该方法用于判断指定类对象是否是一个动态代理类
public static boolean isProxyClass(Class<?> cl) 

// 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
public static Object newProxyInstance(ClassLoader loader,
 Class<?>[] interfaces,InvocationHandler h)

java.lang.reflect.InvocationHandler:

调用处理器接口,自定义invokle方法,用于实现对于真正委托类的代理访问。

/**
 该方法负责集中处理动态代理类上的所有方法调用。
 第一个参数既是代理类实例,
 第二个参数是被调用的方法对象
 第三个方法是调用参数。
 调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行
*/
public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable;
上一篇下一篇

猜你喜欢

热点阅读