一.动态代理
* 特点:字节码随用随创建,随用随加载
* 不修改源码增强
分类:
* 基于接口的动态代理
* 基于子类的动态代理
*
二.基于接口的动态代理
public interface IProducer {
void saleProduct(float money);
void afterService(float money);
}
public class Producer implements IProducer {
public void saleProduct(float money){
System.out.println("销售产品"+money);
}
public void afterService(float money){
System.out.println("售后服务"+money);
}
}
public class Client {
public static void main(String[] args) {
Producer producer = new Producer();
/*= 基于接口的动态代理
* Proxy
* 使用Proxy类中的newProxyInstance方法
* ClassLoader loader 加载代理对象的字节码
Class<?>[] interfaces 让代理对象和被代理对象有相同的方法
InvocationHandler h 用于提供增强的代码*/
IProducer p=(IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
/*执行被代理对象的任何接口方法均会经过此方法*/
/**
*
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue=null;
Float money = (Float) args[0];
if("saleProduct".equals(method.getName())){
returnValue= method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
p.saleProduct(1000);
}
}
二.基于子类的动态代理
pom文件
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
</dependencies>
public class Producer {
public void saleProduct(float money){
System.out.println("销售产品"+money);
}
public void afterService(float money){
System.out.println("售后服务"+money);
}
}
public class Client {
public static void main(String[] args) {
Producer producer = new Producer();
/*动态代理
* 基于子类的动态代理
* Enhancer
* 使用cglib库 Enhancer类中的create方法
* Class 字节码
* Callback 用于提供增强的代码,使用子接口实现类 MethodInterceptor
* */
Producer cgp=(Producer)Enhancer.create(Producer.class, new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object returnValue=null;
Float money = (Float) objects[0];
if("saleProduct".equals(method.getName())){
returnValue= method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
cgp.saleProduct(1000f);
}
}
168万+

被折叠的 条评论
为什么被折叠?



