`

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();
		
	}

}
 
分享到:
评论

相关推荐

    论文研究-Java动态代理在AOP中的应用 .pdf

    Java动态代理在AOP中的应用,薄栋,邓芳,AOP(Aspect-Oriented-programming)是一种支持横切关注点的分解的技术,表达更高的抽象层次。它对于横切关注点就像面向对象程序设计对于对象�

    JAVA动态编译

    但是学习java动态编译有助于我们从更深一层次去了解java。对掌握jdk的动态代理模式,还有比如CGLIB,Spring 的AOP的原理就很有帮助。这样我们在学习其他一些开源框架的时候就能够知其然也知其所以然。

    java开源包4

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Spring AOP的静态代理和动态代理,转移到调用处理器一个集中的方法中处理.docx

    为某一个对象创建一个代理对象,程序不直接用原本的对象,而是由创建的代理对象来控制原对象,通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制...

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java开源包11

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包6

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包9

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包5

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包101

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    Java 1.6 API 中文 New

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了...

    java开源包8

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包10

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包3

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java开源包1

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java api最新7.0

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了...

    JavaAPI1.6中文chm文档 part1

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

Global site tag (gtag.js) - Google Analytics