统一抽象接口类Car
public interface Car {
public void run();
public void stop();
}
静态代理
具体实现类与代理类都要实现同一个接口
具体实现类Target、代理类StaticProxyFactory
public class StaticProxyFactory implements Car {
private Target target;
public StaticProxyFactory() {
}
public StaticProxyFactory(Target target) {
this.target = target;
}
@Override
public void run() {
target.run();
System.out.println("runing.............");
}
@Override
public void stop() {
target.stop();
System.out.println("stoped!!!!!!!!!!");
}
private static class Target implements Car {
@Override
public void run() {
System.out.println("run");
}
@Override
public void stop() {
System.out.println("stop");
}
}
public static void main(String[] args) {
StaticProxyFactory staticProxyFactory = new StaticProxyFactory(new Target());
staticProxyFactory.run();
staticProxyFactory.stop();
}
}
执行结果
run
runing…
stop
stoped!!!
JDK代理(动态代理)
具体实现类需实现接口(因为生成代理对象需要获取具体类的接口信息)
代理类需实现InvocationHandler接口并重写invoke方法,通过反射包里的Proxy类获取代理对象
具体实现类WhiteCar
public class WhiteCar implements Car {
@Override
public void run() {
System.out.println("Run");
}
@Override
public void stop() {
System.out.println("Stop");
}
}
代理工厂ProxyFactory
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){
// 目标对象的类加载器、接口信息、处理类(重写invoke方法)
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("fire");
Object invoke = method.invoke(target, args);
return invoke;
}
});
}
public static void main(String[] args) {
Car whiteCar = new WhiteCar();
ProxyFactory proxyFactory = new ProxyFactory(whiteCar);// 注入目标对象
Object proxyInstance = proxyFactory.getProxyInstance(); // 获取代理对象
System.out.println(proxyInstance.getClass());
((Car)proxyInstance).run();
}
}
执行结果
class com.sun.proxy.$Proxy0
fire
Run
Cglib子类代理
被代理的类无需实现接口的任意普通类
代理工厂CglibProxyFactory
普通类BUS
public class Bus {
public void go() {
System.out.println(“Go for it!”);
}
}
import com.zdb.test.proxy.Car;
import com.zdb.test.proxy.WhiteCar;
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 CglibProxyFactory implements MethodInterceptor {
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}
public Object getInstance() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());// 设置父类
enhancer.setCallback(this);// 设置回调函数
Object o = enhancer.create(); // 创建子类对象
return o;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("----- CgLib");
Object invoke = method.invoke(target, objects);
return invoke;
}
public static void main(String[] args) {
CglibProxyFactory cglibProxyFactory = new CglibProxyFactory(new Bus());
Object instance = cglibProxyFactory.getInstance();
System.out.println(instance);
((Bus) instance).go();
}
}
执行结果
----- CgLib
com.zdb.test.proxy.cglib.Bus@53e25b76
----- CgLib
Go for it!