关键信息
创建一个代理类的核心方法:
package java.lang.reflect;
Proxy类
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
采用反射进行方法调用:
Object result = method.invoke(target, args);
通过方法参数可以看出,如果需要创建一个代理类,必须要有一个目标类,目标类必须实现接口,自定义一个实现InvocationHandler 接口的类。
代码示例
package proxy.base;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DefInvocationHd implements InvocationHandler {
private Object target;
//target必须从调用者传入
//被代理的实例对象
public DefInvocationHd(Object target) {
this.target = target;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Do something before");
Object result = method.invoke(target, args);
System.out.println("Do something after");
return result; }
}
编写一个代理:
package proxy.base;
import proxy.aop.HelloServeImpl;
import proxy.aop.HelloService;
import java.lang.reflect.Proxy;
public class DefMyProxy {
public static void main(String[] args) {
HelloService helloService = new HelloServeImpl();
Object obj = Proxy.newProxyInstance(helloService.getClass().getClassLoader(),
helloService.getClass().getInterfaces(),new DefInvocationHd(helloService));
HelloService hsp = (HelloService)obj;
hsp.sayHello("简单代理");
}
}
运行结果:
Do something before
简单代理
Do something after