1.需要代理的对象:
接口
public interface Action {
void move(String name);
void stop();
}
实现
public class ActionImpl implements Action {
@Override
public void move(String name) {
System.out.println("moving " + name);
}
@Override
public void stop() {
System.out.println("stop");
}
}
2.代理类,实现InvocationHandler
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName() + ": log start");
method.invoke(target, args);
System.out.println(method.getName() + ": log end");
return null;
}
}
3.客户端实现
public class Client {
public static void main(String[] args) {
Action a = new ActionImpl();
InvocationHandler h = new LogHandler(a);
Action proxy = (Action)Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), h);
proxy.move("car");
proxy.stop();
}
}
2和3可以和成一个,利用内部类实现:
public class Client {
public static void main(String[] args) {
getAction(new ActionImpl()).move("car2");
}
public static Action getAction(final Action a) {
return (Action)Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName() + ": log start");
method.invoke(a, args);
System.out.println(method.getName() + ": log end");
return null;
}
});
}
}