Java RTTI初探

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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值