(一)静态代理
public interface Computer {
double sale(double price);
}
public class ComputerImpl implements Computer {
@Override
public double sale(double price) {
System.out.println("卖电脑卖了"+price);
return price;
}
}
public class ComputerProxy implements Computer{
private Computer computer = new ComputerImpl();
@Override
public double sale(double price) {
price+=500;
double result = computer.sale(price);
return result;
}
}
测试
public class Test {
public static void main(String[] args) {
ComputerProxy computerProxy = new ComputerProxy();
double result = computerProxy.sale(500);
System.out.println(result);
}
}
结果
卖电脑卖了1000.0
1000.0
(二)动态代理
基于jdk的动态代理
public interface Computer {
double sale (double price);
}
public class ComputerImpl implements Computer{
@Override
public double sale(double price) {
System.out.println("卖电脑卖了"+price);
return price;
}
}
public class ComputerInvocationHandler implements InvocationHandler {
private Computer computer;
public ComputerInvocationHandler(Computer computer) {
this.computer = computer;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
double price = (double)args[0];
price+=500;
double result = (double) method.invoke(computer, price);
return result;
}
}
测试
public class Test {
public static void main(String[] args) {
Computer computer = new ComputerImpl();
ComputerInvocationHandler invocationHandler = new ComputerInvocationHandler(computer);
Computer computerProxy = (Computer)Proxy.newProxyInstance(computer.getClass().getClassLoader(), computer.getClass().getInterfaces(), invocationHandler);
double result = computerProxy.sale(500);
System.out.println(result);
}
}
结果
卖电脑卖了1000.0
1000.0
也可以通过匿名内部类的方式,省略ComputerInvocationHandler 类
public class Test {
public static void main(String[] args) {
//被代理对象
Computer computer = new ComputerImpl();
//代理对象
Computer proxy =(Computer) Proxy.newProxyInstance(computer.getClass().getClassLoader(),
computer.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
double price = (double) args[0];
price += 500;
double result = (double)method.invoke(computer, price);
return result;
}
});
double result = proxy.sale(500);
System.out.println(result);
}
}
基于继承的动态代理
public class Computer {
public double sale(double price){
System.out.println("卖电脑卖了"+price);
return price;
}
}
public class CglibFactory implements MethodInterceptor {
private Object target;
public CglibFactory(Object target) {
this.target = target;
}
/* public Object getInstance(){
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(target.getClass());
//回调函数
enhancer.setCallback(this);
return enhancer.create();
}*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
double price = (double)objects[0];
price+=500;
double result = (double)method.invoke(target,price);
return result;
}
}
测试
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
CglibFactory cglibFactory = new CglibFactory(computer);
Computer com =(Computer) Enhancer.create(computer.getClass(), computer.getClass().getInterfaces(), cglibFactory);
com.sale(500);
}
}
结果
卖电脑卖了1000.0
动态代理和静态代理区别?
静态代理:代理对象的class文件在程序运行前已经存在
动态代理:代理对象的class文件是在运行过程中由程序动态创建出来
静态代理编译期生成代理类;动态代理运行期生成代理类。
JDK的动态代理和Cglib的动态代理区别?
jdk动态代理代理类要实现一个接口,cglib动态代理是基于继承