首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-11-10 
Thinking in Java:第十四章 类型信息运行时类型信息使得你可以在程序运行时发现和使用类型信息。14.1 为什

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类》

热点排行