package fu.proxy; import java.lang.reflect.Proxy; public class MainProcess { /** * @param args */ public static void main(String[] args) { //传给调用处理器,用来执行请求转发 TestImpl testImpl=new TestImpl(); //实现InvocationHandler接口的处理器 MyInvocationHandler handler=new MyInvocationHandler(testImpl); //该方法返回指定接口的动态的代理类的实例 ITest test=(ITest)Proxy.newProxyInstance(ITest.class.getClassLoader(), new Class[]{ITest.class},handler ); //方法的执行 test.add(5, 4); } } =------------实现类 package fu.proxy; public class TestImpl implements ITest { public void add(int i, int j) { System.out.println(i+j); } } 调用处理器 package fu.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { //传一个具体的对象的引用,目的是为了进行请求转发 //当然你可以用set方法,不用构造函数,二者挑一 /* private Object proxied; private setProxied(Object proxied;){ this.proxied=proxied;; } */ private Object proxied; public MyInvocationHandler(Object proxied){ this.proxied=proxied; } //该方法的各项参数的说明的详细情况请查看文档说明,很简单 public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { System.out.println("之前"); //***后面的参数是可变参数,因为你不知道该对象有多少个参数 //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法 //如果方法正常完成,则将该方法返回的值返回给调用者; //***如果该值为基本类型,则首先适当地将其包装在对象中。 //但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中; //****换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。 return method.invoke(proxied, arg); } }