动态代理是通过Java的反射机制,创建代理类的对象。
动态代理可以在不改变原来的代码的基础上,在代理中写增强功能的代码。
UsbShell.java
package dontaidiali.service;
/**
* 目标接口
*/
public interface UsbShell {
float sell(int amount);
}
UsbKingFactory.java
package dontaidiali.factory;
import dontaidiali.service.UsbShell;
/**
* 目标类
*/
public class UsbKingFactory implements UsbShell {
@Override
public float sell(int amount) {
return 85.0f;
}
}
MyHander.java
package dontaidiali.shangjia;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler {
private Object target = null;
public MyHandler(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 +15;
res = price;
}
System.out.println("通过代理");
return res;
}
}
Test.java
package dontaidiali;
import dontaidiali.factory.UsbKingFactory;
import dontaidiali.service.UsbShell;
import dontaidiali.shangjia.MyHandler;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
//1.创建目标对象
UsbShell taobao = new UsbKingFactory();
//2.创建MyHandler对象
InvocationHandler daiLi = new MyHandler(taobao);
//3.创建代理对象
UsbShell proxy = (UsbShell) Proxy.newProxyInstance(taobao.getClass().getClassLoader(),
taobao.getClass().getInterfaces(),
daiLi);
//4.代理对象调用方法
float s = proxy.sell(1);
System.out.println(s);
}
}
运行结果