1.文件列表:
业务接口:UserService
业务实现:UserServiceImpl
代理类的调用Handler实现:ProxyHandler
JUnit测试类:SpringProxyTest
2.少废话,贴代码:
package com.niewj.service; import com.niewj.model.User; public interface UserService { void add(User user); void delete(User user); }
package com.niewj.service; import com.niewj.model.User; public class UserServiceImpl implements UserService { @Override public void add(User user) { System.out.println("User Saved. & "); } @Override public void delete(User user) { System.out.println("User Deleted. &"); } }
package com.niewj.service; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * JDK动态代理模拟 * * 1.首先明确什么是目标对象target,什么是代理对象proxy!! * * 2.每个代理对象对象都会有一个相关的InvocationHandler对象。 * 当代理对象生成的时候,是创建的代理对象, * 拿着相关的这个InvocationHandler对象,去自动调Handler类中实现的invoke方法的。 * 下面一段话来自@javadoc@ * <p>Each proxy instance has an associated invocation handler. * When a method is invoked on a proxy instance, the method * invocation is encoded and dispatched to the <code>invoke</code> * method of its invocation handler. * * 3.还有就是我发现,我的Eclipse控制台TMD输出的顺序有误,害的老以为我人品出了什么问题, * 不知道控制台的信息是不是不是栈式输出的。(好绕口) * */ public class ProxyHandler implements InvocationHandler { // 就是要给这个目标类创建代理对象。 private Object target; // 传递代理目标的实例,因为代理处理器需要。也可以用set等方法。 public ProxyHandler(Object target) { this.target = target; } /* * 这个方法是给代理对象调用的。 * 留心的是内部的method调用的对象是目标对象,可别写错。 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object ret = null; // 1.调用前 cutIntoBefore(method.getName()); ret = method.invoke(target, args); // 2.调用后 cutIntoAfter(method.getName()); return ret; } public void cutIntoBefore(String mName) { System.err.println("调用____" + mName + "()____方法之前"); } public void cutIntoAfter(String mName) { System.err.println("调用____" + mName + "()____方法完后"); } }
JUnit 测试类:
package com.niewj; import java.lang.reflect.Proxy; import org.junit.Test; import com.niewj.model.User; import com.niewj.service.ProxyHandler; import com.niewj.service.UserService; import com.niewj.service.UserServiceImpl; public class SpringProxyTest { @Test @SuppressWarnings("rawtypes") public void testJDKDynamicProxy() { /* 1.获取UserServiceImpl对象--目标对象--也就是需要被代理的对象。 */ UserService userService = new UserServiceImpl(); // 获取当前类名 Class clazz = userService.getClass(); /* * 2.获得代理对象。 * 每一个代理对象都有一个相关的InvocationHandler对象,通过这个handler对象的invoke来实现调用中要完成的自定义猫腻行为 * 。 可以使用Proxy类和自定义的调用处理逻辑来生成一个代理对象的。 */ UserService userServiceProxy = (UserService) Proxy.newProxyInstance( clazz.getClassLoader(), clazz.getInterfaces(), new ProxyHandler(userService)); userServiceProxy.add(new User("dotjar")); userServiceProxy.delete(new User("DDD")); } }
3.总结:总结在代码里,look up
相关推荐
JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...
JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象...
下面是一个简单的例子,展示如何创建一个JDK动态代理: ```java interface MyService { void doSomething(); } class MyServiceImpl implements MyService { @Override public void doSomething() { System....
在这个“jdk动态代理 + 拦截器实现小例”中,我们将探讨如何利用Java的InvocationHandler接口和Proxy类来实现拦截器模式,以实现灵活的代码扩展和日志记录、性能监控等需求。 首先,让我们理解什么是动态代理。在...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...
这个“JDK内置动态代理例子”旨在演示如何利用Java的反射API和`java.lang.reflect.Proxy`类来实现类似拦截器的功能。下面我们将深入探讨相关知识点。 首先,动态代理的核心在于`java.lang.reflect.Proxy`类。这个类...
jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象能够拦截方法调用并在调用前后执行自定义的行为。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect....
Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...
通过这个例子,我们可以看到,JDK动态代理是如何方便地在不修改原有代码的情况下,为方法调用添加额外行为的。虽然这里只介绍了基本的用法,但实际应用中,JDK动态代理可以实现更复杂的逻辑,是Java开发中的一个重要...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...
这个例子可以帮助开发者理解如何在实际应用中利用JDK动态代理来实现功能扩展,以及如何在Spring框架中无缝集成这一特性。通过实践这个示例,开发者可以更好地掌握面向切面编程的精髓,提升代码的可维护性和灵活性。
这里我们将深入探讨两个主要的Java动态代理实现:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于Java接口实现,适用于目标对象实现了至少一个接口的情况。它通过`java.lang.reflect.Proxy`类和`...
这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...
在Java编程中,JDK动态代理是一种强大的工具,它允许我们在运行时创建代理类来拦截对目标对象的调用,从而实现额外的功能,比如日志记录、性能监控、事务管理等,而无需修改原始代码。这里我们将深入探讨JDK动态代理...
两者在性能上,CGlib通常比JDK代理稍快,但创建代理的过程相对复杂。选择哪种代理方式取决于具体的需求和项目情况。了解并掌握这两种动态代理技术,能够使你在处理AOP(面向切面编程)等高级编程需求时游刃有余。
在Java开发中,JDK动态代理是一个非常重要的概念,它允许我们在运行时创建对现有接口的代理实现。这种技术在很多场景下都有应用,比如面向切面编程(AOP)和框架设计。本文将深入探讨JDK动态代理的代码组织方式以及...
在这个"动态代理(AOP)简单例子"中,可能会展示如何使用JDK或CGLIB创建代理对象,以及如何使用匿名类实现InvocationHandler接口。同时,通过对比直接调用和动态调用,可以更直观地理解动态代理带来的优势。这个例子...
在Java中,动态代理基于JDK的java.lang.reflect包中的两个关键类:Proxy和InvocationHandler。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口定义了一个方法,这个方法会在代理对象调用目标...