静态代理
一次只能代理一个具体的类
接口类
public interface InterfaceA {
void exec();
}
- 接口类的具体实现类
public class InterfaceAlmpl implements InterfaceA {
@Override
public void exec() {
System.out.println("this is real impl class");
}
}
- 代理类 也是接口的实现类
public class ProxyInterfaceAlmpl implements InterfaceA {
private InterfaceA interfaceA;
public ProxyInterfaceAlmpl(){
interfaceA = new InterfaceAlmpl();
}
@Override
public void exec() {
System.out.println("do something befor ");
interfaceA.exec();
System.out.println("do something after ");
}
}
- 调用者 的角度看不出调用的是哪个实现类
public class Main {
public static void main(String[] args){
// 静态代理proxy
InterfaceA interfaceA = new ProxyInterfaceAlmpl();
interfaceA.exec();
}
}
JDK动态代理
- 一个代理接口 多个实现
public class InterfaceAHandle implements InvocationHandler {
private Object object;
public InterfaceAHandle (Class object){
try {
this.object = object.newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
before();
Object result = method.invoke(object,objects);
afre();
return result;
}
private void afre() {
System.out.println("Dynamic do somethin after ");
}
private void before() {
System.out.println("Dynamic do something befor ");
}
}
- 调用方法
InterfaceA interfaceA1 =(InterfaceA) Proxy.newProxyInstance(InterfaceAlmpl.class.getClassLoader(),InterfaceAlmpl.class.getInterfaces(),new InterfaceAHandle(InterfaceAlmpl.class));
interfaceA1.exec();