静态代理与动态代理

静态的代码:

package java2_proxy;
interface ClothFactory{
    void produceCloth();
}

//  代理类
class ProxyClothFactory implements ClothFactory{
    private ClothFactory factory;
//    用被代理类的对象进行实例化
    public ProxyClothFactory(ClothFactory factory) {
        this.factory = factory;
    }

    @Override
    public void produceCloth() {
        System.out.println("代理工厂在工作: public void produceCloth()");
        factory.produceCloth();
        System.out.println("代理工厂后续工作:public void produceCloth()");
    }
}
//被代理类
class NikeClothFactory implements ClothFactory{

    @Override
    public void produceCloth() {
        System.out.println("NikeClothFactory  生产衣服");
    }
}
public class FieldTest {
    public static void main(String[] args) throws Exception {
//        被代理类的对象
        ClothFactory nikeClothFactory = new NikeClothFactory();
//        代理类的对象
        ClothFactory proxyClothFactory = new ProxyClothFactory(nikeClothFactory);
        proxyClothFactory.produceCloth();
    }
}

动态的代码:

package java2_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Human{
    String getBelief();
    void eat(String food);
}
class SuperMan implements Human{
    @Override
    public String getBelief() { return "i can fly";}
    @Override
    public void eat(String food) {
        System.out.println("i like" + food);
    }
}

//代理类
class ProxyFactory{
    public static Object getProxyInstance(Object object){
//        object 被代理类的对象
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(object);
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler);

    }
}
class HumanUtil{
    public void method1(){
        System.out.println("=============public void method1()==========");
    }
    public void method2(){
        System.out.println("=============public void method2()==========");
    }
}

class MyInvocationHandler implements InvocationHandler{
//  将被代理类要执行的方法
    private Object obj;
    public void bind(Object obj){
        this.obj = obj;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        HumanUtil humanUtil = new HumanUtil();
        humanUtil.method1();
        Object returnValue = method.invoke(obj, args);
        humanUtil.method2();
        return returnValue;
    }
}

public class ProxyTest {
    public static void main(String[] args) {
        SuperMan superMan = new SuperMan();
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);
        System.out.println(proxyInstance.getBelief());
        proxyInstance.eat("doufu");
        System.out.println("----------");
        java2_proxy.NikeClothFactory nikeClothFactory = new java2_proxy.NikeClothFactory();
        java2_proxy.ClothFactory proxyInstance1 = (java2_proxy.ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);
        proxyInstance1.produceCloth();

    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务