Java实现动态代理涉及Proxy和InvocationHandler两个类。
此处的代码想要模范AOP的日志模块
// LogIntercepter.java
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import spring.dao.impl.UserDAOImpl; import spring.model.User; public class LogIntercepter implements InvocationHandler { Object obj; //被代理的目标 public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public void beforeMethod(Method m) { System.out.println(m.getName()); } @Override public Object invoke(Object proxy, Method method, Object... args) throws Throwable { beforeMethod(method); return method.invoke(proxy, args); } public static void main(String[] args) throws NoSuchMethodException, SecurityException, Throwable { LogIntercepter intercepter = new LogIntercepter(); LogProxy log = new LogProxy(); intercepter.setObj(log); intercepter.invoke(log, log.getClass().getMethod("beforeSave")); } }
此处要调用reflect的Method类,用于获取被代理对象的方法;写了一个测试方法,用反射机制调用beforeSav()方法;
//LogProxy.java
public class LogProxy { public void beforeSave() { System.out.println("before save"); } }
之后就可以通过LogIntercepter调用obj的指定方法,可以再设定一类接口,规定好方法,之后就可以动态指定各类方法了。