jdk文档:
测试代码如下:
一个接口:MyInterface
public interface MyInterface { public void print(); public void test(int num); }
实现以上接口的类:MyTest
public class MyTest implements MyInterface{ public void print(){ System.out.println("MyTest print"); } public void test(int num){ System.out.println(num); } }
处理类:MyTestHandler
public class MyTestHandler implements InvocationHandler { private MyInterface mytest = null; public MyInterface bind(MyInterface test) { //注意传递的参数类型是接口,而不是实现类 this.mytest = test; MyInterface proxyTest = (MyInterface) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), this); return proxyTest; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //具体的处理策略,根据方法名判断 Object obj = null; if ("print".equals(method.getName())) { System.out.println("got it"); } else if ("test".equals(method.getName())) { int num = (Integer)args[0]; System.out.println(num+2); } else { obj = method.invoke(mytest, args); //交给目标对象处理 } return obj; } }
测试类:Main
public class Main { public static void main(String args[]){ MyTest test = new MyTest(); MyTestHandler handler = new MyTestHandler(); MyInterface proxy = handler.bind(test);//绑定方法返回对象的代理,以后可以操作该代理,隐藏了实际的对象 proxy.test(3); } }
分析:
通过对代理类的调用,代替了对实际类MyTest的调用,在invoke方法中,可以截获对方法的调用,针对特定的策略采取相应的措施。无需特殊处理的话,还是调用实际的对象的方法。
补充:
摘自jdk文档:
Proxy的静态方法: