Java RTTI初探

来源:互联网 发布:json的实际应用 编辑:程序博客网 时间:2024/06/05 12:25

RTTI: run-time type identification

import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/* Class对象的生成方式如下: * 1) Class.forName("类名字符串")  (注意:类名字符串必须是全称,包名+类名) * 2) 类名.class * 3) 实例对象.getClass() *//*  * (节选自 http://blog.sina.com.cn/s/blog_4c1c2d43010007fx.html) * 每一个类都有一个Class对象,每当编译一个新类,就会产生一个Class对象(保存在一个同名的.class文件中) * 在运行时,当我们想生成这个类的对象时,运行这个程序的JVM首先检查这个类的Class对象是否已经加载, * 如果尚未加载,JVM就会根据类名查找.class文件,并将其载入, * 所以Java程序并不是一开始执行就被完全加载的,这一点与许多传统语言都不同的. * 一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象 *  */class MyClass {    // 构造函数    MyClass() {        System.out.println("MyClass--构造函数");    }    public void myMethod() {        System.out.println("MyClass--myMethod()");     }    //静态成员初始化      static{            System.out.println("MyClass--静态成员初始化");      }      //非静态成员初始化      {            System.out.println("MyClass--非静态成员初始化");      }  }public class HelloWorld {    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {        System.out.println(MyClass.class instanceof Class); // true         System.out.println("--------------");        // 然而在打印这行分隔符时,class MyClass仍未进行静态成员初始化        // 说明此时class MyClass还未被完全加载进来        Class ClassMyClass = Class.forName("MyClass");         // 根据打印结果,class MyClass做了静态成员初始化        System.out.println("--------------");        System.out.println(ClassMyClass);        System.out.println(ClassMyClass instanceof Class); // true        System.out.println(ClassMyClass instanceof Object); // true        System.out.println("--------------");        ClassMyClass.newInstance();        MyClass myClass = new MyClass();        // Method用法具体可参考 http://blog.csdn.net/cuiran/article/details/5302074        Method MethodmyMethod =  ClassMyClass.getMethod("myMethod", null);        MethodmyMethod.invoke(myClass, null);        System.out.println("--------------");        //MyClass myClass = new MyClass();         // MyClass.class -- 即"类名.class"        // myClass.getClass() -- 即"该类的一个对象.getClass()"        // Class.forName("MyClass") -- 即"Class.forName(类名字符串)"        // 返回的结果都是Class类(class Class)的对象        System.out.println(MyClass.class instanceof Class); // true        System.out.println(myClass.getClass() instanceof Class); // true        System.out.println(Class.forName("MyClass") instanceof Class); // true        // 并且三者相等        System.out.println(myClass.getClass() == MyClass.class); // true        System.out.println(Class.forName("MyClass") == MyClass.class); // true        // 仅仅类名的话,啥也不是        //System.out.println(MyClass);          System.out.println("quit");    }}
0 0
原创粉丝点击