实现动态代理的步骤:
1. 创建接口,定义目标类要完成的功能
这里定义一个卖Usb的接口
//目标接口
public interface UsbSell {
float sell(int amount);
}
2. 创建目标类实现接口
这里定义一个UsbKingFactory类来实现接口,金士顿厂家
//目标类
import com.bjpowernode.service.UsbSell;
public class UsbKingFactory implements UsbSell {
@Override
public float sell(int amount) {
//目标方法
System.out.println("目标类种,执行sell目标方法");
return 85.0f;
}
}
3.创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//必须实现InvocationHandler接口,来完成代理类要做的功能(1.调用目标方法,2.执行功能增强)
public class MySellHandler implements InvocationHandler {
private Object target = null;
//动态代理:目标对象是活动的,不是固定的,需要传入进来。
//传入是谁,就给谁创建代理
public MySellHandler(Object target){
//给目标对象赋值
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = null;
res = method.invoke(target,args);//执行目标方法
if (res != null){
Float price = (Float)res;
price = price + 25;
res = price;
}
return res;
}
}
4.使用Proxy类的静态方法,创建代理对象。 并把返回值转为接口类型。`
import com.bjpowernode.factory.UsbKingFactory;
import com.bjpowernode.handler.MySellHandler;
import com.bjpowernode.service.UsbSell;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class MainShop {
public static void main(String[] args) {
//创建代理对象,使用Proxy
//1.创建目标对象
UsbSell factory = new UsbKingFactory();
//2.创建InvocationHandler对象
InvocationHandler handler = new MySellHandler(factory);
//3.创建代理对象
UsbSell proxy = (UsbSell)Proxy.newProxyInstance(factory.getClass().getClassLoader(),
factory.getClass().getInterfaces(),
handler);
//4.通过代理执行方法
float price = proxy.sell(1);
System.out.println("通过动态代理对象,调用方法:" + price);
}
}
执行结果截图: