`

java 基于接口代理(JDK)和基于类的代理(CGLIB)

 
阅读更多
JDK基于接口代理

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

interface BookInterface {

	void addBook();

	void intercept();
};

public class BookImpl implements BookInterface {

	public void addBook() {
		System.out.println("dynamic@BookImpl#addBook");
	}

	public void intercept() {
		System.out.println("dynamic@BookImpl#intercept is intercepted...");
	}
	// 测试方法
	public static void main(String[] args) {
		BookProxy proxy = new BookProxy();
		BookInterface impl = (BookInterface) proxy.getInstance(new BookImpl());
		impl.intercept();
	}
};

/**
 * 
 * @projectName:ActiveMq
 * @packageName: activeMQ.topicMessage
 * @ClassName : BookProxy
 * @createBy :Test
 * @createDate :2013-2-24下午01:23:25
 * @useFor :
 * 
 */
class BookProxy implements InvocationHandler {
	/**
	 * 委托类
	 */
	private Object target;

	public Object getInstance(Object target) {
		this.target = target;

		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), this);
	}

	public Object invoke(Object obj, Method method, Object[] args)
			throws Throwable {
		System.out.println("Before Advice");

		if ("intercept".equals(method.getName())) {
			System.out.println("intercept method is intercepted");

			return null;
		}
		// 注意此处的参数是注入的target 而不是obj
		Object result = method.invoke(target, args);
		System.out.println("After Advice");
		return result;
	}

}


但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

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 BookClass {
	/**
	 * 业务方法 使用cglib则不需要额外定义接口 Description: <br>
	 * 
	 * @see
	 */
	public void addBook() {
		System.out.println("cglib@BookClass#addBook");
	}
	// 测试
	public static void main(String[] args) {
		BookProxy proxy = new BookProxy();
		BookClass bc = (BookClass) proxy.getInstance(new BookClass());
		bc.addBook();
	}
};

/**
 * 
 * @projectName:ActiveMq
 * @packageName: activeMQ.topicMessage
 * @ClassName : BookProxy
 * @createBy :Test
 * @createDate :2013-2-24下午01:31:22
 * @useFor : Cglib 动态代理类 类代理
 * 
 */
class BookProxy implements MethodInterceptor {
	/**
	 * 委托类
	 */
	private Object target;

	public Object getInstance(Object target) {
		this.target = target;
		Enhancer en = new Enhancer();
		en.setSuperclass(target.getClass());
		en.setCallback(this);
		return en.create();
	}

	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("Before Advice");

		// 注意此处的参数是注入的target 而不是obj
		Object result = proxy.invoke(target, args);
		System.out.println("After Advice");
		return result;
	}
};
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java代理机制 JDK动态代理和cglib代理 详解

    JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始类相同的接口,并且在调用接口方法时,可以插入自定义的逻辑。这样,我们就可以在不...

    JDK代理和Cglib代理

    5. 兼容性:JDK代理是Java标准库的一部分,而Cglib是第三方库,可能受到JVM版本和类加载器限制的影响。 总结来说,JDK代理和Cglib代理都是为了在运行时动态创建代理对象,以扩展或修改已有对象的行为。选择哪种方式...

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

    Java动态代理是Java编程中一...JDK动态代理适用于接口代理,简单易用,而CGLIB则适用于非接口类的代理,提供了更广泛的应用场景。理解并熟练掌握这两种动态代理机制,对于提升Java开发的灵活性和可维护性具有重要意义。

    Spring框架中JDK动态代理和cglib动态代理

    这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。 CGLIB 动态代理是基于类的代理, 它可以...

    浅谈JDK动态代理与CGLIB代理去区别

    在选择代理方式时,需要根据项目需求、性能要求和类设计来决定。"Spring_aop3"可能是Spring AOP的进一步讲解,包括AOP的其他概念,如切入点表达式、通知类型等,这些对于理解AOP代理的使用至关重要。 了解这两种...

    java动态代理(JDK和cglib).pdf

    JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于创建动态代理实例,而`...

    Java动态代理(JDK和cglib)

    1. **JDK动态代理** - 基于接口实现的动态代理。 2. **CGLIB动态代理** - 基于继承实现的动态代理。 **JDK动态代理实现:** JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect....

    Java JDK代理、CGLIB、AspectJ代理分析比较

    与JDK动态代理不同的是,CGLIB不需要目标类实现接口,而是通过继承的方式为一个现有的类创建子类并实现增强功能。 CGLIB代理的核心在于它能够为一个类创建一个子类,并在子类中拦截方法调用。这种方式使得CGLIB在...

    CGLIB 和 JDK生成动态代理类的区别

    性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...

    java 动态代理实例(JDK代理与CGLIB代理)

    **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以使用JDK动态代理来创建该对象的代理。以下是JDK...

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

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

    总结,Java动态代理提供了在运行时创建和增强类的能力,JDK动态代理适用于接口代理,而CGLIB则适用于无接口或需代理非接口方法的情况。了解和熟练掌握这两种动态代理机制对于提升Java开发能力至关重要。

    jdk与cglib动态度代理的区别原理

    3. **优点**:由于基于接口,JDK动态代理具有良好的类型安全性和易于理解的API。而且,因为使用了Java内置支持,性能相对较好。 **CGLIB动态代理**: CGLIB是一个第三方的字节码生成库,广泛应用于Spring AOP框架中...

    java动态代理实例(jdk动态代理和cglib)

    JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义接口**:首先,我们需要定义一个或多个接口,这些接口将由代理类实现。例如: ```java public interface ...

    AOP之JDK动态代理和CGLib动态代理

    JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring会创建一个代理对象,这个代理对象实现了与目标对象相同的接口,并在调用接口方法时插入额外的切面逻辑。代理对象在运行...

    输出JDK和CGLib动态代理产生的class文件.zip

    Java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口是实现JDK动态代理的关键。Proxy类提供了一个静态方法`newProxyInstance()`,该方法接收三个参数:一个ClassLoader对象、一个接口数组以及一个...

    JDK和CGlib分别实现的动态代理源代码

    JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,我们可以创建并控制代理对象的行为。`Proxy`类提供了`...

    jdk与cglib动态代理与底层实现

    JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被代理的目标类必须实现至少一个接口。`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是JDK动态代理的核心。Proxy类用于...

Global site tag (gtag.js) - Google Analytics