Java反射 动态代理

2020-04-02  本文已影响0人  lc_666

代理模式

静态代理实例

public class StaticProxyTest {

    public static void main(String[] args) {
        NikeShoeFactory nikeShoeFactory = new NikeShoeFactory();
        ProxyShoeFactory proxyShoeFactory = new ProxyShoeFactory(nikeShoeFactory);
        proxyShoeFactory.makeShoes();
    }
}

interface ShoeFactory{
    void makeShoes();
}

//代理类
class ProxyShoeFactory implements ShoeFactory{

    private ShoeFactory shoeFactory;

    public ProxyShoeFactory(ShoeFactory shoeFactory) {
        this.shoeFactory = shoeFactory;
    }

    @Override
    public void makeShoes() {
        System.out.println("Proxy begins...");
        shoeFactory.makeShoes();
        System.out.println("Proxy ends...");

    }
}
//代理类
class NikeShoeFactory implements ShoeFactory{

    @Override
    public void makeShoes() {
        System.out.println("Making nike shoes...");
    }
}

动态代理实例

public interface Actor {
    void act();

    String sing();
}

//被代理类
public class HuaYiActor implements Actor {

    @Override
    public void act() {
        System.out.println("I am acting....");
    }

    @Override
    public String sing() {
        return "Lalalalala.....";
    }
}
//代理类工厂
public class ProxyFactory {
    // 提供静态方法,放回一个代理类的对象
    public static Object getProxyInstance(Object object) {

        MyInvocationHandler myInvocationHandler =new MyInvocationHandler();
        myInvocationHandler.setObject(object);

        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),
                myInvocationHandler);
    }
}

public class MyInvocationHandler implements InvocationHandler {
    // 需要使用被代理类的对象进行初始化
    private Object object;

    public void setObject(Object object) {
        this.object = object;
    }

    /**
     * 使用代理类的对象调用被代理类的方法时,会调用此方法
     * @param proxy
     * @param method 代理类的方法,也就是需要被代理类执行的方法
     * @param args 代理类方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object, args);
    }
}
public class ProxyTest {
    public static void main(String[] args) {
        HuaYiActor actor = new HuaYiActor();
        Actor proxyInstance = (Actor) ProxyFactory.getProxyInstance(actor);
        actor.act();
        String sing = actor.sing();
        System.out.println(sing);
        //I am acting....
        //Lalalalala.....
    }
}
上一篇 下一篇

猜你喜欢

热点阅读