`

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代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    java动态代理详细解析

    Java动态代理是一种编程技术,主要用于在运行时创建一个新的对象,该对象可以作为现有接口的实现。动态代理的主要目的是为了在不修改原有代码的基础上,为已有的接口或类添加额外的功能,比如日志、事务管理、性能...

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

    Java反射机制与动态代理

    在Java中,动态代理是一种利用反射机制实现的编程技术,主要用于在运行时创建一个代理类,这个代理类可以代表并增强原始目标类的行为。Java的动态代理主要通过`java.lang.reflect.Proxy`和`java.lang.reflect....

    Java静态代理和动态代理

    Java提供了一种称为Java反射API(java.lang.reflect包)的机制来实现动态代理。 1. **获取InvocationHandler**: 首先,我们需要实现`java.lang.reflect.InvocationHandler`接口,其中的`invoke()`方法将在代理类...

    java动态代理实现自定义连接池

    Java动态代理机制是一种强大的工具,它允许我们在运行时创建具有特定接口的新对象,这些对象的行为在编译时未被明确指定。动态代理通常用于实现AOP(面向切面编程)和拦截器模式,使得我们可以在不修改源代码的情况...

    java分页 动态代理 aop实现

    总的来说,Java分页、动态代理和AOP是Java开发中的关键技术,它们能帮助我们构建出更加高效、可维护的Web应用程序。在实际项目中,理解并熟练掌握这些技术,将大大提升我们的开发效率和代码质量。

    java jdk 动态代理演示demo2

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在处理跨层调用、事务管理、日志记录、性能监控等方面非常有用,尤其在AOP(面向切面编程)...

    java动态代理实例aop

    Java动态代理是Java编程中一个非常重要的特性,它在实际开发中被广泛应用于面向切面编程(Aspect-Oriented Programming,简称AOP)领域。AOP是一种编程范式,旨在提高代码的可重用性和模块化,通过将关注点分离,...

    java代理模式和动态代理

    ### Java代理模式和动态代理详解 #### 一、概述 在软件工程中,代理模式是一种常用的软件设计模式,主要用于在不直接暴露目标对象的情况下提供一个替代接口。这种模式可以简化客户端与目标对象之间的交互,同时还...

    java 动态代理模式 适配器模式

    动态代理模式的核心在于能够在运行时动态创建一个实现指定接口的代理类,这个代理类可以对目标对象的方法调用进行额外的处理,如添加日志、性能监控、事务管理等。在Java中,我们可以使用Proxy类和InvocationHandler...

    Android-一个android或java项目的编译时注解动态代理库

    在Android和Java开发中,注解(Annotation)和动态代理(Dynamic Proxy)是两种非常重要的技术,它们在提高代码可维护性、简化编程模式以及实现跨层交互等方面发挥着重要作用。本文将深入探讨"Android-一个android或...

    java动态代理(JDK和cglib)共10页.pdf.zip

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的增强,通常用于实现AOP(面向切面编程)或为已有对象提供额外的服务。在这个主题中,我们将深入探讨JDK动态代理...

    一篇讲动态代理的好文 <动态代理的前世今生>

    ### 动态代理的前世今生 #### 一、引言 动态代理作为一种广泛应用于软件开发中的设计模式,其重要性不言而喻。本文旨在深入探讨动态代理的概念、原理及其...希望本文能为读者提供一个关于动态代理全面而深入的理解。

    动态代理及静态代理及ssh整合

    在IT领域,代理模式是一种常用的设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或控制其行为。动态代理和静态代理是代理模式的两种主要实现方式,它们在Java编程中尤为常见。 首先,让我们从...

    java socket编写的上网代理

    Java Socket 编写的上网代理是一种基于TCP/IP协议的网络通信方式,它允许应用程序通过Socket连接到其他网络服务,实现数据的传输。在这个特定的项目中,开发者使用Java语言实现了代理服务器的功能,允许用户通过该...

    java动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如在AOP(面向切面编程)中实现事务管理、日志记录、性能...

    Java编写的HTTP代理

    Java编写的HTTP代理是一种软件应用,它允许用户通过Java程序作为中介来访问互联网,从而实现对HTTP请求的转发。这种代理服务器通常用于多种用途,包括网络匿名性、内容过滤、性能优化以及网络测试等。在Java中实现...

Global site tag (gtag.js) - Google Analytics