读书人

Thinking in Java:第十四章 门类信息

发布时间: 2012-11-10 10:48:51 作者: rapoo

Thinking in Java:第十四章 类型信息

运行时类型信息使得你可以在程序运行时发现和使用类型信息。

14.1 为什么需要RTTI

在java中,所有的类型转换都是在运行时进行正确性检查的。这也是RTTI的含义:在运行时,识别一个对象的类型。

14.2 Class对象

Class对象就是用来创建类的所有的”常规“对象的。

所有的类都是在第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。因此,诗意哦那个new操作符创建类的新对象也会被当作对类的静态成员的引用。

java程序在它开始运行之前并非完全加载,其各个部分是在必需时才加载的。

//: typeinfo/ModifyingPrivateFields.javaimport java.lang.reflect.*;class WithPrivateFinalField {  private int i = 1;  private final String s = "I'm totally safe";  private String s2 = "Am I safe?";  public String toString() {    return "i = " + i + ", " + s + ", " + s2;  }}public class ModifyingPrivateFields {  public static void main(String[] args) throws Exception {    WithPrivateFinalField pf = new WithPrivateFinalField();    System.out.println(pf);    Field f = pf.getClass().getDeclaredField("i");    f.setAccessible(true);    System.out.println("f.getInt(pf): " + f.getInt(pf));    f.setInt(pf, 47);    System.out.println(pf);    f = pf.getClass().getDeclaredField("s");    f.setAccessible(true);    System.out.println("f.get(pf): " + f.get(pf));    f.set(pf, "No, you're not!");    System.out.println(pf);    f = pf.getClass().getDeclaredField("s2");    f.setAccessible(true);    System.out.println("f.get(pf): " + f.get(pf));    f.set(pf, "No, you're not!");    System.out.println(pf);  }} /* Output:i = 1, I'm totally safe, Am I safe?f.getInt(pf): 1i = 47, I'm totally safe, Am I safe?f.get(pf): I'm totally safei = 47, I'm totally safe, Am I safe?f.get(pf): Am I safe?i = 47, I'm totally safe, No, you're not!*///:~
final域实际上是在遭遇修改时是安全的。运行时系统会在不抛异常的情况下接受任何修改尝试,但是实际上不会发生任何修改。

参考资料:

《 java中Class对象详解》
《java Class类》

读书人网 >编程

热点推荐