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

posted on 2017-04-21 13:51  hazelnut  阅读(100)  评论(0)    收藏  举报

导航