静态代理
/*
静态代理必须要有接口
被代理的类和代理类都去实现接口
代理类持有被代理类的引用
*/
public interface ISell {
void sell();
}
public class Sell implements ISell{
@Override
public void sell() {
System.out.println("arc sell");
}
}
public class SellProxy implements ISell{
private ISell src;
public SellProxy(ISell src) {
this.src = src;
}
@Override
public void sell() {
System.out.println("proxy start");
src.sell();
System.out.println("proxy end");
}
}
public class Client {
public static void main(String[] args) {
ISell src = new Sell();
SellProxy proxy = new SellProxy(src);
proxy.sell();//虽然调用的是代理类 但是真正工作的还是被代理的目标对象
}
}
JDK代理
/*
JDK代理的代理对象不需要实现任何接口
直接借助反射 动态地给被代理的类创建对象
*/
public interface ISell {
void sell();
}
/**
被代理的类
*/
public class Sell implements ISell{
@Override
public void sell() {
System.out.println("src sell");
}
}
/**
代理的类 利用反射产生代理对象
*/
public class SellProxy{
private ISell src;
public SellProxy(ISell src) {
this.src = src;
}
public Object getProxy(){
return Proxy.newProxyInstance(src.getClass().getClassLoader(), src.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy start");
Object returnVal = method.invoke(src, args);
System.out.println("proxy end");
return returnVal;
}
});
}
}
public class Client {
public static void main(String[] args) {
ISell src = new Sell();
SellProxy proxy = new SellProxy(src);
ISell instance = (ISell) proxy.getProxy();//被代理的类需要强转 然后执行被代理的类的方法。
instance.sell();
}
}
CGLIB代理
需要导入
asm
asm-commons
asm-tree
cglib
这四个jar
/**
CGLIB代理不需要任何接口
*/
public class Sell{
public void sell() {
System.out.println("src sell");
}
}
/**
代理类
*/
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class SellProxy implements MethodInterceptor{
private Object src;
public SellProxy(Object src) {
this.src = src;
}
// 产生代理对象
public Object getProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(src.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
/*
监听被代理的对象
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("代理对象的逻辑。。。");
Object returnVal = method.invoke(src, objects);//被代理对象的逻辑
System.out.println("代理对象的逻辑。。。");
return returnVal;
}
}
public class Client {
public static void main(String[] args) {
SellProxy proxy = new SellProxy(new Sell());
Sell src = (Sell)proxy.getProxy();
src.sell();
}
}