Java中的JDK动态代理
实现步骤
1代理对象和真实对象实现相同接口
先创建一个接口 并创建一个类实现接口中的方法
创建接口Salecomputer
public interface Salecomputer {
abstract public String sale(double money);
abstract public void show ();
}
创捷实现类 实现接口
public class lenvo implements Salecomputer{
@Override
public String sale(double money) {
System.out.println("花了"+money);
return "买电脑";
}
@Override
public void show() {
System.out.println("买了电脑");
}
}
创建测试类
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class proxyText {
public static void main(String[] args) {
//创建真实对象
lenvo lenvo = new lenvo();
//动态代理增强 lenvo 对象
// Proxy.newProxyInstance();创建一个代理实例
//第二个参数为被代理对象(真实对象)的接口 //第三个参数为 实现InvocationHandle的匿名内部类(zai)
//Proxy.newProxyInstance() 返回一个Object 类型的代理对象 我们可以把它转为接口类型
Salecomputer proxy_lenvo = (Salecomputer) Proxy.newProxyInstance(lenvo.getClass().getClassLoader(), lenvo.getClass().getInterfaces(),
new InvocationHandler() {
//invoke 方法:代理逻辑编写的方法,代理对象调用的所有方法都会执行该方=
//参数 1 proxy -代理对象
// 2 method 代理对象调用的方法封装为的对象
// 3 args 代理对象调用方法时传递的实际参数数组[]
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1增强参数 (需要参数的方法才需要增强)在该结口中只有 sale 需要参数
if(method.getName().equals("sale")){
//业务逻辑
double money = (double) args[0];
money = money *0.85;
//使用真实对象调用方法
Object obj = method.invoke(lenvo, money);
// 增强返回值
return obj + "送了一个鼠标";
}else {
Object obj = method.invoke(lenvo, args);
return obj;
}
}
}
);
//使用代理对象 调用被代理对象的方法
String computer = proxy_lenvo.sale(8888);
System.out.println(computer);
}
}
本文来自博客园,作者:冰莫莫,转载请注明原文链接:https://www.cnblogs.com/icemomo/p/15994272.html