Java代理模式

public class ServiceProxy implements InvocationHandler{
    /**目标对象*/
    private Object targetObj;
    
    public ServiceProxy(Object targetObj) {
        this.targetObj = targetObj;
    }
    /**
     * 产生一个代理对象
     * @return 代理对象
     */
    public Object getProxy() {
        //产生代理对象,第一个参数为目标对象的类加载器,第二个参数为目标对象实现的接口列表,第三个参数为InvocationHandler的实现类
        //当调用代理对象方法时,会执行InvocationHandler实现类的invoke方法
        return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),
                targetObj.getClass().getInterfaces(), this);
    }
    /**
     * proxy 代理对象,method 目标方法对象,args 目标方法执行时传入的实参列表
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
        //得到目标对象的属性列表
        Field[] f = targetObj.getClass().getDeclaredFields();
        for (Field field : f) {
            //类型是否为接口
            if(field.getType().isInterface()) {
                //产生实现类对象
                Object implObj = DaoFactory.getBean(field.getType().getSimpleName());
                field.setAccessible(true);
                field.set(targetObj, implObj);
            }
        }
        //执行目标对象的目标方法,得到目标方法执行后的返回结果
        Object returnObj = method.invoke(targetObj, args);
        return returnObj;
    }
}

 

posted @ 2020-08-10 09:56  FivePointOne  阅读(98)  评论(0编辑  收藏  举报