java动态代理上是否能再进行一层代理

CGLIB动态代理类

 

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 CglibProxy implements MethodInterceptor {  
    private Object target;  
  
    /** 
     * 创建代理对象 
     *  
     * @param target 
     * @return 
     */  
    public Object getInstance(Object target) {  
        this.target = target;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());  
        // 回调方法  
        enhancer.setCallback(this);  
        // 创建代理对象  
        return enhancer.create();  
    }  
  
    @Override  
    // 回调方法  
    public Object intercept(Object obj, Method method, Object[] args,  
            MethodProxy proxy) throws Throwable {  
        System.out.println("事物开始CGLIB");  
        proxy.invokeSuper(obj, args);  
        System.out.println("事物结束CGLIB");  
        return null;  
    }  
    
  
}  

 

 java动态代理类

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.springframework.aop.framework.AopProxy;

public class ClassProxy implements InvocationHandler ,AopProxy{  
    private Object target;  
    /** 
     * 绑定委托对象并返回一个代理类 
     * @param target 
     * @return 
     */  
    public Object bind(Object target) {  
        this.target = target;  
        //取得代理对象  
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),  target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)  
    }  
  
    @Override  
    /** 
     * 调用方法 
     */  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        Object result=null;  
        System.out.println("事物开始");  
        //执行方法  
        result=method.invoke(target, args);  
        System.out.println("事物结束");  
        return result;  
    }

	@Override
	public Object getProxy() {
		System.out.println("test getProxy");
		return null;
	}

	@Override
	public Object getProxy(ClassLoader classLoader) {
		System.out.println("test getProxy");
		return null;
	}
}

 

尝试在java动态代理上进行java动态代理或者cglib代理,或者cglib代理上进行java动态代理或者cglib代理测试结果如下:

import java.lang.reflect.Modifier;

import org.springframework.aop.framework.AopProxy;

public class TestProxy {

	public static void main(String[] args) {
//		ClassProxy proxy = new ClassProxy();
//		AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());
//		bookProxy.getProxy();
//	    int i = bookProxy.getClass().getModifiers();
//        String mods = Modifier.toString(i);
//        System.out.println("Class modifiers: " + mods);
//		CglibProxy cglib = new CglibProxy();
//		ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  
//		bookCglib.getProxy();
//		ClassProxy bookCglib2=(ClassProxy)cglib.getInstance(bookCglib);  
//		bookCglib2.getProxy();
		
		//JDK代理后再进行一层jdk代理,测试结果不可以,循环调用,造成代理的死循环
//		ClassProxy proxy = new ClassProxy();
//		AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());
//		AopProxy bookProxy2 = (AopProxy) proxy.bind(bookProxy);
//		bookProxy2.getProxy();
		
		
		//jdk代理后再用cglib进行代理,测试结果不行,因为jdk代理后的类是public final类型的,cglib不能对final的类进行代理
//		ClassProxy proxy = new ClassProxy();
//		AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());
//		bookProxy.getProxy();
//	    int i = bookProxy.getClass().getModifiers();
//        String mods = Modifier.toString(i);
//        System.out.println("Class modifiers: " + mods);
//		CglibProxy cglib = new CglibProxy();
//		ClassProxy bookCglib=(ClassProxy)cglib.getInstance(bookProxy);  
//		bookCglib.getProxy();
		
		//CGlib代理后再进行cglib代理,测试结果不可以  Caused by: java.lang.ClassFormatError: Duplicate method name&signature 
//		CglibProxy cglib = new CglibProxy();
//		ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  
//		ClassProxy bookCglib2=(ClassProxy)cglib.getInstance(bookCglib);  
//		bookCglib2.getProxy();
		
		//CGlib代理后再进行jdk代理,测试结果不可以,因为CGlib代理后已经改变了类的签名,而jdk必须知道类的接口和实现
		CglibProxy cglib = new CglibProxy();
		ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  
		bookCglib.getProxy();
		ClassProxy proxy = new ClassProxy();
		AopProxy bookProxy = (AopProxy) proxy.bind(bookCglib);
		bookProxy.getProxy();
		
	}

}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值