java反射实现动态代理模式

代理模式的作用是:为其他对象提供一种可以控制的访问方式,

代理的角色:
1.抽象角色  声明真实对象和代理对象需要实现的接口;
2.代理角色  代理对象内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象
提供与真实对象相同的接口,以便在任何时刻都能替代真实对象,同时代理对象可以在执行真实对象操作时,
附加其他的操作,想当于对真实对象进行封装。

3.真实角色  实现抽象角色的实现类的对象


使用动态代理模式时,代理对象不需要实现抽象接口

抽象角色:

public interface Cat{

    void eat(String foodName);
}

真实角色:

public class MyCat implements Cat{
    public void eat(String foodName){
        Log.e("Cat", "我爱吃" + foodName);
    }
}

代理角色:

//必须实现InvocationHandler接口
public class MyProxy implements InvocationHandler{
    //被代理的对象
    private Object obj
;

    public MyProxy(Object obj){
        this.obj= obj;
    }

    /**
     * @param method  被代理对象的接口方法
     * @param objects 被代理对象的接口方法的参数
     */
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable{
        Log.e("MyProxy", "吃饭前要洗手");
        //invoke为方法的返回值
        Object invoke = method.invoke(obj, objects);    
        Log.e("MyProxy", "吃完饭要洗碗");
return invoke ; }}

//使用代理

//创建借口实现类的对象
MyCat harry = new MyCat();
//返回值为实现的接口类型
Cat cat = (Cat) Proxy.newProxyInstance(harry.getClass().getClassLoader(), harry.getClass()
        .getInterfaces(), new MyProxy(harry));
//通过接口对象调用接口方法
cat.eat("鱼");

//输出日志

 E/MyProxy: 吃饭前要洗手

 E/Cat: 我爱吃鱼

E/MyProxy: 吃完饭要洗碗



 

你可能感兴趣的:(java)