java的代理和cglib的代理

北城以北 提交于 2020-02-25 19:15:03

动态代理:随用随加载 1.基于接口的动态代理 使用jdk提供:Proxy 中的newProxyInstance()的方法
* 要求:被代理实现一个类,否则不能使用
* newProxyInstance()方法的参数
* ClassLoader 用于加载代理对象的字节码,要求和被代理对象使用相同的类加载器 * interfaces, 让代理对象和被代理对象具有相同的方法
* InvocationHandler 提供增强的代码
* 有一个invoke方法
* proxy 代理对象的引用
* method 当前执行的方法
* args 当前执行方法所需的参数,和被代理对象有相同的返回值

//给出了main方法

public static void main(String\[\] args) {  
final Iproducer iproducer=new Producer();  
Iproducer proxy=  (Iproducer)Proxy.newProxyInstance(iproducer.getClass().getClassLoader(),  

iproducer.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Float money=(Float)args[0];
Object value=null;
//判断当前方法
if("sale".equals(method.getName()))
value= method.invoke(iproducer,money*0.8f);
return value;
}
});
proxy.sale(1000f);
}

2.基于子类的动态代理 使用cglib

给出main方法 public static void main(final String[] args) {
final Producer producer = new Producer();

Producer enhanceProducer= (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
/**

  • * @param proxy 代理对象的引用
    * @param method 当前执行的方法
    * @param objects 当前执行方法所需要的参数
    * @param methodProxy 当前执行方法的代理对象
    * @return
    * @throws Throwable
    / public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    System.out.println(proxy.getClass());
    System.out.println(methodProxy.getClass());
    Float money =(Float) objects[0];
    Object value=null;
    if(method.getName().equals("sale"))
    value=method.invoke(producer,money
    0.8f);
    return value;
    }
    });
    enhanceProducer.sale(10000f);
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!