动态代理:随用随加载
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,money0.8f);
return value;
}
});
enhanceProducer.sale(10000f);
}
来源:oschina
链接:https://my.oschina.net/u/2511906/blog/3164778