guava中com.google.common.reflect.Reflection类创建代理对象

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);
      }
    }
  }

猜你喜欢

转载自blog.csdn.net/yaomingyang/article/details/81041680