TIJ C14 类型信息
TIJ Chapter 14
TypeInfo
Class类
- 类是程序的一部分,每个类都有一个Class对象。每当编写或编译了一个新的类,就会产生一个与之对应的Class对象,保存在同名的.class文件中。
- 该类所获取的信息也称为RTTI,runtime typeinfo,是在编译期就获取的类对象信息。
- Class对象的生成是靠类加载器这个子系统实现的。当创建第一个对类的静态成员的引用时,就会加载这个类。(因此,只有在需要的时候,类才会被加载。)
获取指定的Class对象:Class.forName()
''publi static Class forName(String absoluteName)
注意输入的类名要全限定名(包含包名)。
常见方法
- getName()
- getSimpleName()
- getInterfaces()
- getSuperClass()
- isInterface()
- newInstance() 创建出来的是一个Object对象,但是实际的类型是Class对应的类,可以用向下转型获取合适的类型。
类字面常量:类名.class
可以直接用类名加上.class获取对应的类,这样更安全,可以在编译期就进行检查,不用特意进行异常抛出。
泛化的Class引用
可以在Class后加上泛型,以进一步地提高安全性。
- 代表任意类
- 任意继承SuperClass的类
- 任意BaseClass的超类
使用了泛型的Class的newInstance会直接返回相应类型的新对象。
instanceof
返回一个布尔值,告诉我们前面的对象是不是后面的类。如果是子类也一样会返回true。
不要过多使用instanceof,如果使用了很多的instanceof,说明程序的设计有问题。
动态测试对象
使用Class.isInstance方法来实时地获取类判断的信息。
反射
RTTI可以用于获取编译时就能确定的类的类信息,而反射还能进一步获取获取运行时导入的不在本地的类的类信息。Class类和java.lang.reflect类库一起对反射的概念进行了支持。
- 类库中包含Field、Method、Constructor类。
Class的动态方法
Method[] .getMethods()Filed[] .getFields()Constructor[] .getConstructors()
反射类库中的动态方法
Constructor.newInstance()Field.get()获取field中信息Field.set()更改field中信息Method.invoke()调用该方法
动态代理
== 没太看懂 ==
空对象
== 后半部分涉及动态代理的没太看懂 ==
总结
章节难度:4
掌握程度:2
浙公网安备 33010602011771号