代理:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
作用:在不改变目标对象方法的情况下对方法进行增强
应用:aop,mybatis接口化编程
例子:
首先接口A
public interface A {
int function1();
String function2();
}
目标对象的类实现了这个接口
public class AImpl implements A{
@Override
public int function1() {
return 1;
}
@Override
public String function2() {
return "string";
}
}
处理器,通过重写invoke方法可以实现对目标对象的代理访问,Method的invoke方法可以动态执行对应方法。
public class MyInvocationHandle implements InvocationHandler {
private AImpl aImpl;
MyInvocationHandle(AImpl aImpl){
this.aImpl = aImpl;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("function1")) {
System.out.println("动态代理");
return method.invoke(aImpl, args);
}else if (method.getName().equals("function2")){
System.out.println("动态代理");
return method.invoke(aImpl,args);
}
return null;
}
}
测试类,通过Proxy类的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法创建代理对象o
public class Test {
public static void main(String[] args) {
Object o = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
new Class[]{A.class},
new MyInvocationHandle(new AImpl()));
A a = (A) o;
System.out.println(a.function1());
System.out.println(a.function2());
}
}