先看动态代理类
package ProxyDemo;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class MyProxy implements InvocationHandler { private Object obj; public Object init(Object ob) {
ClassLoader cl = ob.getClass().getClassLoader();
this.obj = Proxy.newProxyInstance(cl, ob.getClass().getInterfaces(),
this);
return obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("123");
method.invoke(obj, args);
return null;
}}测试类
package ProxyDemo;import java.lang.reflect.InvocationHandler;
public class demo {
public static void main(String[] args) throws Exception { IProxyBiz pr = new MyAchieve();
MyProxy han = new MyProxy();
pr=(IProxyBiz)han.init(pr);
pr.say();

}
}异常为UndeclaredThrowableException 异常出现不断递归MyProxy.invoke 方法 
代理实现类没问题 就简单的测试而已。
在线等结果。

解决方案 »

  1.   

    你再去看看代理模式的关系图,InvocationHandler持有的应该是被代理对象,你的obj持有的却是代理类实例
    package 动态代理;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;class MyProxy implements InvocationHandler { private Object obj; public Object init(Object ob) {
    obj = ob;
    ClassLoader cl = ob.getClass().getClassLoader();
    return Proxy.newProxyInstance(cl, ob.getClass().getInterfaces(), this); } @Override
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    // TODO Auto-generated method stub
    System.out.println("123");
    method.invoke(obj, args);
    return null;
    }}class MyAchieve implements IProxyBiz {
    @Override
    public void say() {
    System.out.println("say");
    }
    }interface IProxyBiz {
    void say();
    }public class Test123 {
    public static void main(String[] args) throws Exception { IProxyBiz pr = new MyAchieve();
    MyProxy han = new MyProxy();
    pr = (IProxyBiz) han.init(pr);
    pr.say(); }
    }
      

  2.   

    正如LS所说,代理对象应该持有的是被代理对象的实例,而你持有的是他本身产生的代理对象,所以会不断递归调用invoke。package com.study.dynamicproxy;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;/**
     * 动态代理对象
     * @author penggl
     * @version 1.0
     */
    public class ObjectDynamicProxy implements InvocationHandler{ //真实对象引入
    private Object proxyObj; public void setObj(Object obj) {
    this.proxyObj = obj;
    }

    public ObjectDynamicProxy(Object obj){
    this.proxyObj = obj;
    } public Object invoke(Object object, Method method, Object[] args)
    throws Throwable {

    System.out.println("before dynamic proxy method.");

    Object obj = method.invoke(proxyObj, args);

    System.out.println("after dynamic proxy method.");

    return obj;
    }

    /**
     * 代理对象生产工厂
     * @param obj
     * @return
     */
    public static Object factory(Object obj) {
    //获取传入对象的Class对象
    Class<?> classType = obj.getClass(); //生成代理对象并返回
    //该对象实现传入对象所实现的接口
    //生成的代理对象的所有方法都由第三个参数的invoke方法来接管和调用
    return Proxy.newProxyInstance(classType.getClassLoader(), classType
    .getInterfaces(), new ObjectDynamicProxy(obj));
    }
    }
    //////////////////////////测试类
    package com.study.dynamicproxy;import java.util.ArrayList;
    import java.util.List;
    /**
     * 客户端测试
     * @author penggl
     * @version 1.0
     */
    public class Client { @SuppressWarnings("unchecked")
    public static void main(String[] args) {

    //通过代理对象生成工厂生成该代理对象
    List list = (List)ObjectDynamicProxy.factory(new ArrayList());

    list.add("hello");
    }
    }