java 代理分为 2 种
第一种是基于子类的坊间用的 cglib,第二种是基于接口的官方的
一、基于子类代理
子类
public class serviceImpl{
public void save() {}
}
代理类
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class cglibProxyFactory implements MethodInterceptor {
//目标对象
private Object target;
//构造方法注入目标对象
public cglibProxyFactory(Object target) {
super();
this.target = target;
}
//创建代理方法
public Object createCgligProxyFactory(){
//建立Enhancer对象
Enhancer enhancer = new Enhancer();
//对目标对象建立子类
enhancer.setSuperclass(target.getClass());
//传入CallBack,对目标增强
enhancer.setCallback(this);
//建立代理对象
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy father) throws Throwable {
System.out.println("代理前");
//Object obj = method.invoke(target, args);
Object obj = father.invokeSuper(proxy, args);//执行父类的方法
System.out.println("代理后");
return obj;
}
}
测试类
import org.junit.Test;
public class cglibProxyTest {
@Test
public void ProxyTest(){
serviceImpl s = new serviceImpl();
serviceImpl sp = (serviceImpl) new cglibProxyFactory(s).createCgligProxyFactory();
sp.save();
}
}
二、基于 jdk 接口代理
接口及接口实现类
public interface Service {
public void save();
}
public class serviceImpl implements Service {
public void save() {
}
}
代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class jdkproxyFactory implements InvocationHandler{
//目标的对象
private Object target;
//注入目标对象
public jdkproxyFactory(Object target) {
super();
this.target = target;
}
//建立代理
public Object createProxy(){
//3个参数,类加载器,接口,invocationhandler
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
Object obj = method.invoke(target, args);
System.out.println("代理后");
return obj;
}
}
测试类
import org.junit.Test;
public class jdkProxyTest {
@Test
public void ProxyTest(){
Service s = new serviceImpl();
Service sp = (Service)new jdkproxyFactory(s).createProxy();
sp.save();
}
}
以上就是 JAVA2 种代理的实现方法,本人在工作中接口代理用的居多,子类代理用的比较少。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于