1. 首先,定义一个接口,并实现该接口;
2. 然后,定义一个handler,实现InvocationHandler接口,实现其invoke方法。
这里技巧是通过构造器传入目标代理对象(Object 类型),赋值给内部目标代理对象,
在实现invoke方法时,通过method.invoke(内部目标代理对象,args)实现真实调用;
3. 使用代理时,先构造该handler,然后通过Proxy获取代理实例,最终实现方法代理调用。
举例如下:
public interface HelloWorld {
public void sayHelloWorld();
}
public class HelloWorldImpl implements HelloWorld{
@Override
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
public class HelloWorldHandler implements InvocationHandler{
private Object targetObject;
public HelloWorldHandler(Object targetObject){
this.targetObject = targetObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法调用前...");
Object result = method.invoke(this.targetObject, args);
System.out.println("方法调用结束...");
return result;
}
}
public class HelloWorldTest {
public static void main(String[] args) {
//业务对象
HelloWorldImpl obj = new HelloWorldImpl();
//拦截器对象
HelloWorldHandler handler = new HelloWorldHandler(obj);
//返回业务对象的代理对象
HelloWorld proxy = (HelloWorld)Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
handler);
//通过代理对象执行业务对象的方法
proxy.sayHelloWorld();
}
}