Java Proxy 代理学习

1.我说理解的代替

  

用图说话 直接上代码

public class Facade implements InvocationHandler{

    private Object obj = null;
    
    private static Facade facade = null;
    
    
    private static Facade getInstence(){
        if(facade == null){
            facade = new Facade();
        }
        return facade;
    } 
    
    public static Object get(Object obj){
        getInstence().obj  = obj;
        /**
         * 说明:这里可以看做返回一个代理对象 
         * 这个方法的作用:1.载入Interface的Class里面会自动在JVM里面找到这个Interface的实现
         *                   2.载入一个 InvocationHandler 这个Hander所做的事情就是在方法调用之前 之后干你想做的事
         *                   3.真正返回的是接口实现的对象
         */
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), getInstence());
    }
    
    /**
     * 重写代理调用
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("Before Method Exec");
        Object result = method.invoke(obj, args);
        System.out.println("After Method Exec");
        return result;
    }

}

接口 必须实现

/**
 * 
 * @author yunyang
 *
 */
public interface IProxyInterface {
    
    public void add();
    
    public void delete();
}

接口实现

public class ProxyImpl implements IProxyInterface {

    @Override
    public void add() {
        // TODO Auto-generated method stub
        System.out.println("Add Method Exec");
        
    }

    @Override
    public void delete() {
        // TODO Auto-generated method stub
        System.out.println("Delete Method Exec");
    }

}

测试代码

public class Test {
    public static void main(String[] args) throws ClassNotFoundException,Exception {
        IProxyInterface impl = (IProxyInterface)Facade.get(new ProxyImpl());
        
        //这里看做是代理对象调用的方法 只是和原有对象方法一样那样就好理解了
        impl.add();
        impl.delete();
    }
}

这样的好处 把接口以及实现写到接口文件里面 那样可以降低耦合 facade 思想

原文地址:https://www.cnblogs.com/yy199110/p/3080246.html