Java的动态代理简单理解

第一部分main函数部分,先看这个地方对整个程序的执行思路有所理解。

package com.test.DynamicProxy;

import java.lang.reflect.Proxy;

/**
 * 动态代理的真实面目是:使用一个实现类(Faker)的信息(classLoader和interfaces[])来生成一个通用类(Proxy)的对象(proxy),
 * 这个通用类的对象有了实现类(Faker)的基本信息其实已经可以通过反射完成调用(如果再传入Faker的class对象就满足实现反射的必要条件了),
 * 不过为了实现"可以任意执行不同对象的方法(动态性)"以及"在调用前后加上一些其他操作(比如RPC)",代理类又找了一个帮手palyInvoke来满足自定义代码的要求
 * 在生成proxy的方法Proxy.newProxyInstance中,要求用户传递一个实现了InvocationHandler接口的类的对象(playInvoke, 这个对象持有实现类对象faker)。
 * 最后,proxy代理对象的调用最后都交给playInvoke来完成(根据方法名、对象和参数列表,使用反射完成调用,在使用反射的前后还可以加其他辅助类代码)。
 *
 */

public class Main {
    public static void main(String[] args) {
        PlayInvoke playInvoke = new PlayInvoke(new Faker());
        Person proxy = (Person)Proxy.newProxyInstance(Faker.class.getClassLoader(), Faker.class.getInterfaces(), playInvoke);
        proxy.playLOL();

        playInvoke.setObject(new MLXG());
        proxy.playLOL();
    }
}

接口
定义了一个方法

package com.test.DynamicProxy;

public interface Person {
    public void playLOL();
}

第一个实现类:
实现了这个方法,输出调用信息
package com.test.DynamicProxy;

public class MLXG implements Person {
    public void playLOL() {
        System.out.println("I like to gank!");
    }
}

第二个实现类

package com.test.DynamicProxy;

public class Faker implements Person {
    public void playLOL() {
        System.out.println("I play LOL best!");
    }
}

代理类的handler:
通过反射真正的执行方法
package com.test.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class PlayInvoke implements InvocationHandler {

    private Object object;

    public PlayInvoke(Object object) {
        this.object = object;
    }

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("实现类PlayInvoke真正工作了:");
        return method.invoke(object, args);
    }
}

参考文档:
《十分钟理解Java之动态代理》
https://www.jianshu.com/p/cbd58642fc08

你可能感兴趣的:(Java)