17. 动态代理与类加载器核心知识点汇总
动态代理
Proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理的超类。
newProxyInstance方法
static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
/**
* 动态代理类
*
* @author tengchao
* @create 2017-12-17-11:50.
*/
public class MyProxy {
//定义一个获取代理类对象的方法
//JDK7之前包括JDK7,若要往内部类中传变量的话,这个变量必须要用final修饰
public static Object getProxy(final Object t) {
//返回生成后的代理类对象
return Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), new InvocationHandler() {
//proxy:代表生成的代理类对象,method:代表通过代理类对象调用的对应的方法对象,args:代表往该方法中传入的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强的方法逻辑
System.out.println("我是增强的方法逻辑~~~");
//被增强的执行方法
return method.invoke(t,args);
}
});
}
}
这段代码的核心就是
Proxy.newProxyInstance(...)
方法,该方法就是对一组接口进行动态的生成其代理对象,其中的ClassLoader要求为AppClassLoader,可以使用自己定义的任意类.clss.getClassLoader()获取该类加载器,intefaces定义一个Class[]数组,把需要动态实现的接口放入其中即可,对接口具体的方法实现只需要定义另外的一组InvocationHandler接口的实现类去重写它的invoke()方法。假如说有一个Person接口,Person接口有一个实现类为Teacher,那么,我可以定义一个Teacher变量来接收通过
Proxy.newProxyInstance(...)
返回的代理类对象吗?答案是不行的,通过
Proxy.newProxyInstance(...)
返回的是Person的接口的代理类对象,这么说可能有些抽象,下面就说具体点,在此处就等于Proxy.newProxyInstance是一个程序员,现在给他一个Person接口,让他去定义一个Person接口的实现类出来,也就是说通过这个方法最后返回的也等同于Person接口的一个实现类,而Teacher是Person的另一个实现类,那么Teacher和代理类等于是同级关系,怎么可能用Teacher变量来存储代理类的引用呢?
类加载器
类加载器是负责加载类的对象。将class文件加载到内存生成Class对象。所有的类加载器都是java.lang.ClassLoader的子类。
类加载器中最顶层的是BootstrapClassLoader引导类加载器,继承它的是ExtClassLoader扩展类加载器,继承扩展类加载器的是AppClassLoader应用类加载器。
注意:初学者有关类加载器最应该知道的一点是所有用户自己写的类通过getClassLoader获取的类加载器对象都是APPClassLoader对象。
Last updated
Was this helpful?