动态代理
定义一个接口类,并使用实现类实现了这个接口。当进行代理时,拦截器会拦截此接口类的请求,并自动调用invoke方法。由Proxy对象负责搭配接口和拦截器,一旦完成配置,proxy就可以使用接口类的方法,且会自动执行拦截器的invoke方法。
实例
接口类userService
1 2 3 4
| public interface userService { void adduser(String name); void deleteuser(String name); }
|
实现类userServiceImpl
1 2 3 4 5 6 7 8 9 10 11
| public class userServiceImpl implements userService{ @Override public void adduser(String name) { System.out.println("已添加: "+name); }
@Override public void deleteuser(String name) { System.out.println("已删除: "+name); } }
|
拦截器handler(需要继承InvocationHandler类)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class handler implements InvocationHandler { private Object targrt;
public handler(Object targrt) { this.targrt = targrt; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("adduser")){ System.out.println("--正在添加用户--"); method.invoke(targrt,args); System.out.println("--添加成功--"); }else { System.out.println("--正在删除用户--"); method.invoke(targrt,args); System.out.println("--删除成功--"); } return null; } }
|
代理类proxy
1 2 3 4 5 6 7 8 9
| public class proxy { public static void main(String[] args) { InvocationHandler handler = new handler(new userServiceImpl()); userService proxy =(userService) Proxy.newProxyInstance(proxy.class.getClassLoader(), new Class[]{userService.class}, handler); proxy.adduser("dis"); proxy.deleteuser("ddis"); new userServiceImpl().adduser("dddis"); } }
|
代理对象可以使用配置类的所以方法,且调用时自动调用拦截类处理,如果配置类实现类对象直接调用方法,则不会被拦截。
而拦截类handler传入的参数就是实现类对象,传入的原因的通过反射调用它原本的方法,就相当于是重写了
proxy.adduser("dis")->handler->handler.invoke