动态代理

动态代理

代理模式:

使用一个代理将对象包装起来,然后使用这个代理对象取代原始对象,任何对原始对象的操作都要通过代理,代理对象·决定是否以及何时将方法调用转到原始对象上。

public class ProxyTest {
    public static void main(String[] args){
        Interface test=new ProxyInterface(new RealInterface());
        test.test();
    }
}
interface Interface{
    public void test();
}
class RealInterface implements Interface{
    @Override
    public void test() {
        System.out.println("我是真正的类");
    }
}
class ProxyInterface implements Interface{
    private Interface anInterface;

    public ProxyInterface(Interface anInterface) {
        this.anInterface = anInterface;
    }

    private void check(){
        System.out.println("代理类的一些检查工作");
    }
    @Override
    public void test() {
        check();
        anInterface.test();
        System.out.println("我是代理类");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args){
        RealInterface realInterface=new RealInterface();
        Interface test=(Interface) ProxyFactory.getProxyInstance(realInterface);
        //只能执行接口中含有的方法。
        //test.getAge();
        test.test();
    }
}
interface Interface{
    public void test();
}
class RealInterface implements Interface{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public void test() {
        System.out.println("我是真正的类");
    }
}
class ProxyFactory{
    public static Object getProxyInstance(Object object){
        MyInvocationHandler myInvocationHandler=new MyInvocationHandler();
        myInvocationHandler.bind(object);
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),myInvocationHandler);
    }
}
class MyInvocationHandler implements InvocationHandler{
    private Object object;
    public void bind(Object object){
        this.object=object;

    }
    //此处的proxy其实就是生成的代理类
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object,args);
    }
}
posted on 2021-10-14 18:16  gyp666  阅读(38)  评论(0)    收藏  举报