1 接口
package www.test.service; public interface UserService { public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void find(); }
2 实现接口类的代码
package www.test.service; public class UserServiceImpl implements UserService { @Override //添加用户 public void add() { System.out.println("添加用户"); } @Override //删除用户 public void delete() { System.out.println("删除用户"); } @Override //修改用户 public void update() { System.out.println("修改用户"); } @Override //查找用户 public void find() { System.out.println("查找用户"); } }
3 获取动态代理工厂-1
package www.test.c_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import www.test.service.UserService; import www.test.service.UserServiceImpl; //1 创建一个类实现InvocationHandler public class UserServiceProxyFactory1 implements InvocationHandler { private UserService us; public UserServiceProxyFactory1(UserService us) { this.us = us; } //获得动态的代理对象----在运行时 在内存中动态的为 UserServiceImpl 创建一个虚拟的代理对象 public UserService getUserServiceProxy(){ //生成动态代理 UserService usProxy = (UserService)Proxy.newProxyInstance( UserServiceProxyFactory1.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), this); return usProxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("目标方法前的逻辑"); Object invoke = method.invoke(us, args); System.out.println("目标方法前的逻辑"); return invoke; } }
3 获取动态代理工厂-2
package www.test.c_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import www.test.service.UserService; import www.test.service.UserServiceImpl; public class UserServiceProxyFactory2 { private UserService us; public UserServiceProxyFactory2(UserService us) { this.us = us; } //获得动态的代理对象----在运行时 在内存中动态的为 UserServiceImpl 创建一个虚拟的代理对象 public UserService getUserServiceProxy(){ UserService usProxy = (UserService) Proxy.newProxyInstance( //loader :与目标对象相同的类加载器 UserServiceProxyFactory2.class.getClassLoader(), // interfaces :代表与目标对象实现的所有接口字节码对象数组 UserServiceImpl.class.getInterfaces(), //h: 具体的操作,InvocationHandler接口 new InvocationHandler() { //invoke 代表的是执行代理对象的方法 //method: 代表目标对象的方法字节码对象 //args:代表目标对象的相应的方法的参数 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("目标方法前的逻辑"); //执行目标方法 Object invoke = method.invoke(us, args); System.out.println("目标方法后的逻辑"); return invoke; } }); return usProxy; } }
4 获取动态代理工厂-3(简洁)
package www.test.c_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import www.test.service.UserService; import www.test.service.UserServiceImpl; public class UserServiceProxyFactory3 { private UserService us; public UserServiceProxyFactory3(UserService us) { this.us = us; } //获得代理对象 public UserService getUserServiceProxy(){ UserService usProxy = (UserService) Proxy.newProxyInstance( UserServiceProxyFactory3.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("目标方法前的逻辑"); //执行目标方法 Object invoke = method.invoke(us, args); System.out.println("目标方法后的逻辑"); return invoke; } }); return usProxy; } }
5 测试
1 UserServiceProxyFactory1 测试
package www.test.c_proxy; import org.junit.Test; import www.test.service.UserService; import www.test.service.UserServiceImpl; public class Demo { @Test //动态代理 public void fun1(){ UserService us = new UserServiceImpl(); UserServiceProxyFactory1 proxyFactory = new UserServiceProxyFactory1(us); UserService usProxy = proxyFactory.getUserServiceProxy(); usProxy.add(); //代理对象与被代理对象实现了相同的接口 //代理对象与被代理对象没有继承关系 System.out.println(usProxy instanceof UserServiceImpl); //false } }
2 UserServiceProxyFactory2 测试
package www.test.c_proxy; import org.junit.Test; import www.test.service.UserService; import www.test.service.UserServiceImpl; public class Demo2 { @Test public void fun1(){ UserService us = new UserServiceImpl(); UserServiceProxyFactory2 proxyFactory = new UserServiceProxyFactory2(us); UserService usProxy = proxyFactory.getUserServiceProxy(); usProxy.delete(); //代理对象与被代理对象实现了相同的接口 //代理对象与被代理对象没有继承关系 System.out.println(usProxy instanceof UserServiceImpl);//false; } }