Java动态代理的使用方法及示例我已经在前几篇文章中详细讲解过了,接下来讲解com.google.common.reflect.Reflection工具类创建代理类的使用方法,其中会用到接口、接口实现类、代理类的调用处理程序,这些类都可以在:Java中InvocationHandler接口中第一个参数proxy详解中找到,我就不再重复了。
Reflection类中有多个方法newProxy、getPackageName、initialize,其中newProxy是我们最常用的方法,接下来我们就对这几个方法的用法做一个介绍:
1.newProxy:创建真实对象的代理对象
newProxy方法有两个参数:
第一个参数:是代理对象接口的class实例对象
第二个参数:是代理对象的调用处理程序,也就是实现InvocationHandler接口的类对象
package com.test.Application;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.google.common.reflect.Reflection;
public class Test {
public static void main(String[] args) {
People people = new Student();
InvocationHandler handler = new WorkHandler(people);
People proxy = (People)Reflection.newProxy(People.class, handler);
proxy.work("财务").work("会计");
String time = proxy.time();
System.out.println(time);
}
}
2.getPackageName获取指定的类所在的包名
String package1 = Reflection.getPackageName(People.class);
System.out.println(package1);
String package2 =Reflection.getPackageName("com.test.Application.Test");
System.out.println(package2);
输出结果是类所在的包名称:
com.test.Application
com.test.Application
3.initialize方法能够保证特定的类能够被初始化
我们可以看下方法的源码,它使用类加载器将特定的方法加载到jvm中:
public static void initialize(Class<?>... classes) {
for (Class<?> clazz : classes) {
try {
Class.forName(clazz.getName(), true, clazz.getClassLoader());
} catch (ClassNotFoundException e) {
throw new AssertionError(e);
}
}
}