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动态代理的思想,资源为拷贝的视频讲解的内容。
jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压
个人写的动态代理的简单例子 模拟拦截器的实现
java动态代理例子,这里面有两个例子,一个是jdk的动态代理,一个是cglib的动态代理,让你明白什么是动态代理,动态代理可以做什么。
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { super(); ...
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
Spring Aop的底层实现技术 --- Jdk动态代理原理 很不错的一篇文章
熟悉代理模式的可以直接点击目录第二章,jdk动态代理实现原理,本文的精髓所在,通过这个例子,教大家如何去学习源码。 1. 定义 代理模式(Proxy Pattern) 是一个使用频率非常高的设计模式,其定义如下: Provide a ...
对代理模式的介绍,静态代理,JDK动态代理,CGLIB动态代理的介绍,例子
在故事中,小明是一个客户,它让小红帮忙购买香水,小红就成了一个代理对象,而香水提供商是一个真实的对象,可以售卖香水,小明通过代理商小红,购买到法国的香水,这就是一个代购的例子。我画了一幅图帮助理解这个...
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
java中代理的使用,包括静态代理、JDK动态代理、CGLIB动态代理的例子,想了解AOP和动态代理的童鞋可以看下
本文档先讲解了JDK的反射机制,然后是Proxy的动态代理、CGLIB的动态代理,因为这些是Spring AOP的底层技术,清楚了它们,你就更能够理解Spring AOP是如何工作的。在文档的最后简要写了Spring AOP的使用,因为这不是...
JDK动态代理例子,idea下的项目,直接打开可用
springAOP等框架中,大量用到代理技术;...1,java动态代理,见JDK文档或相关java书; 2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单
4.1.1 JDK动态代理 58 JDK动态代理拓展: 59 4.1.2 CGLIB做代理 66 CGLIB动态代理拓展: 68 4.1.3 Spring的动态代理 71 4.2 AOP编程 71 4.2.1概念: 71 SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
动态代理(JDK代理,借口代理) package basicKnowledge.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * JDK 动态代理 * */ ...
接下来,让我们看一些实现动态代理的例子。 1.2 创建调用者 首先,让我们定义一个接口。 public interface EchoService { String echo(String message); } 通过使用运行时代码生成技术,您可以在不定义Class的情况下...
代理服务器,ProxyServer.java; telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chat...