5.7.1 Class 类

image.png

Go 中的反射包括 reflect.Type, reflect.Value, Java 中通过 getClass() 也可以获取对象信息.

通过类名创建 Class:

  1. String className = "java.util.Random";
  2. Class cl = Class.forName(className);

第三种获得 Class 的方法:

  1. Class cl1 = Random.class;

使用 Class 创建对应实例:

  1. String className = "java.util.Random";
  2. Class cl = Class.forName(className);
  3. // 对应类应具有无参构造器
  4. Object obj = cl.getConstructor().newInstance();

5.7.2 声明异常入门

异常的类型:

  • 非检查型
    • 越界
    • 引用 null
  • 检查型
  1. public static void main(String[] args)
  2. throws ReflectiveOperationException
  3. {
  4. Manager m = new Manager("abc", 1, 2, 3, 4);
  5. String[] ss = new String[]{"abc", "def"};
  6. m.Print(ss);
  7. System.out.println(m.getClass().getName());
  8. Class cl = Class.forName("abc");
  9. }

这里可以简单对比一下 Go 和 Java 的错误处理:

  • 如果是 Go, 方法签名类似 func forName(string) (Class, error)
  • Java 的形式如上述代码, 直接向上抛出错误, 也就是说使用 Java 写代码心情会流畅一些, 不像 Go 被 error 中断

5.7.3 资源

  • 图片
  • 声音
  • 字符串

国际化.

5.7.4 利用反射分析类的能力

java.lang.reflect 包的三个类:

  • Field
  • Method
  • Constructor

5.7.5 使用反射在运行时分析对象

获取值:

image.png

设置值:

  1. f.set(obj, value);

只能对可访问的字段使用 get, set

可以覆盖访问控制:

  • 访问可以被模块系统或安全管理器拒绝
  1. f.setAccessible(true);

5.7.6 使用反射编写泛型数组代码

5.7.7 调用任意方法和构造器

image.png

image.png