目标类接口proxyService.java
public interface proxyService {
public void saleComputer(Float money);
}
目标类Computer.java
package com.cenzn.service.impl;
import com.cenzn.service.proxyService;
public class ComputerFactory implements proxyService {
public void saleComputer(Float money) {
System.out.println("厂家获得"+money);
}
}
jdk实现动态代理
客户端Client.java
package com.cenzn;
import com.cenzn.service.impl.ComputerFactory;
import com.cenzn.service.proxyService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
final proxyService sale = new ComputerFactory();//厂家直接卖
/**
* 代理:
* 间接。
* 获取代理对象:
* 要求:
* 被代理类最少实现一个接口
* 创建的方式
* Proxy.newProxyInstance(三个参数)
* 参数含义:
* ClassLoader:和被代理对象使用相同的类加载器。
* Interfaces:和被代理对象具有相同的行为。实现相同的接口。
* InvocationHandler:如何代理。
*
*/
proxyService proxySale = (proxyService) Proxy.newProxyInstance(
ComputerFactory.class.getClassLoader(),
ComputerFactory.class.getInterfaces(),
new InvocationHandler() {
/**
* 执行被代理对象的任何方法,都会经过该方法。
* 此方法有拦截的功能。
*
* 参数:
* proxy:代理对象的引用。不一定每次都用得到
* method:当前执行的方法对象
* args:执行方法所需的参数
* 返回值:
* 当前执行方法的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
Float money = (Float) args[0];
Object rtValue = null;
rtValue = method.invoke(sale,money*0.7f);
return rtValue;
}
});
/**
* 不用代理商,厂家直销
*/
//sale.saleComputer(10000f);
/**
* 用代理商,用一部分钱给代理商
*/
proxySale.saleComputer(10000f);
}
}
运行结果
厂家获得7000.0
cglib实现动态代理
客户端CglibClient.java
package com.cenzn;
import com.cenzn.service.impl.ComputerFactory;
import com.cenzn.service.proxyService;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CglibClient {
public static void main(String[] args) {
final ComputerFactory computer = new ComputerFactory();
/**
* 基于子类的动态代理
* 要求:
* 被代理对象不能是最终类
* 用到的类:
* Enhancer
* 用到的方法:
* create(Class, Callback)
* 方法的参数:
* Class:被代理对象的字节码
* Callback:如何代理
*/
ComputerFactory cglibComputer = (ComputerFactory) Enhancer.create(computer.getClass(),
new MethodInterceptor() {
/**
* 执行被代理对象的任何方法,都会经过该方法。在此方法内部就可以对被代理对象的任何方法进行增强。
*
* 参数:
* 前三个和基于接口的动态代理是一样的。
* MethodProxy:
* 当前执行方法的代理对象。
* 返回值:
* 当前执行方法的返回值
*/
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object rtValue = null;
Float money = (Float) objects[0];
rtValue = method.invoke(computer,money*0.7f);
return rtValue;
}
});
/**
* 厂家直销
*/
//computer.saleComputer(10000f);
/**
* 代理销售
*/
cglibComputer.saleComputer(10000f);
}
}
运行结果
厂家获得7000.0