实现一个动态代理:
public interface Subject {
void request();
}
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("From real subject");
}
}
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(Object obj){
this.sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling : " + method);
method.invoke(this.sub, args);
System.out.println("after calling : " + method);
return null;
}
}
public class Client {
public static void main(String[] args) {
RealSubject rs = new RealSubject();
InvocationHandler ds = new DynamicSubject(rs);
Class<?> cls = rs.getClass();
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
subject.request();
// class com.sun.proxy.$Proxy0
System.out.println(subject.getClass());
// class java.lang.reflect.Proxy
System.out.println(subject.getClass().getSuperclass());
}
}
对Subject任何调用都会转向DynamicSubject里执行,动态代理类只会重写,hashcode,equals, toString三个方法,其他一些基本方法就是调用的父类Object的方法