JDK动态代理小例子
2013-04-17 18:46
393 查看
1.文件列表:
业务接口:UserService
业务实现:UserServiceImpl
代理类的调用Handler实现:ProxyHandler
2.少废话,贴代码:
测试处:
3.总结:总结在代码里,look up
业务接口:UserService
业务实现:UserServiceImpl
代理类的调用Handler实现:ProxyHandler
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 + "()____方法完后"); } }
测试处:
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
相关文章推荐
- Java代理模式之JDK动态代理例子
- spring源码学习之【准备】jdk动态代理例子
- jdk动态代理例子
- JDK动态代理小例子
- jdk动态代理,cglib动态代理例子
- jdk 动态代理基本例子
- Spring学习——jdk动态代理例子
- jdk动态代理的小例子
- jdk动态代理与cglib动态代理例子
- JDK动态代理小例子
- JDK动态代理小例子
- JDK动态代理源码例子解析
- JDK与Cglib实现的动态代理区别以及例子说明
- jdk动态代理小例子
- JDK动态代理的一个例子
- 一个简单的例子模拟JDK动态代理
- Java JDK 动态代理例子
- 实现动态代理的两种方式介绍+例子demo(JDK、CGlib)
- jdk的动态代理的例子
- 自己写的jdk动态代理的例子