5.7.1 Class 类
Go 中的反射包括 reflect.Type, reflect.Value, Java 中通过 getClass() 也可以获取对象信息.
通过类名创建 Class:
String className = "java.util.Random";
Class cl = Class.forName(className);
第三种获得 Class 的方法:
Class cl1 = Random.class;
使用 Class 创建对应实例:
String className = "java.util.Random";
Class cl = Class.forName(className);
// 对应类应具有无参构造器
Object obj = cl.getConstructor().newInstance();
5.7.2 声明异常入门
异常的类型:
- 非检查型
- 越界
- 引用 null
- 检查型
public static void main(String[] args)
throws ReflectiveOperationException
{
Manager m = new Manager("abc", 1, 2, 3, 4);
String[] ss = new String[]{"abc", "def"};
m.Print(ss);
System.out.println(m.getClass().getName());
Class cl = Class.forName("abc");
}
这里可以简单对比一下 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 使用反射在运行时分析对象
获取值:
设置值:
f.set(obj, value);
只能对可访问的字段使用 get, set
可以覆盖访问控制:
- 访问可以被模块系统或安全管理器拒绝
f.setAccessible(true);