菜鸟的Java学习笔记(1)-- RTTI

来源:互联网 发布:为什么要用json 编辑:程序博客网 时间:2024/05/16 13:43

RTTI-- runtime type identification

 

import java.lang.*;

class  TestRTTI
{
    
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException
    
{

        
//测试类型的加载
        new Cls1();
        System.out.println(
"After Create Cls1");
        
try
        
{
            
//第一次加载时执行static代码段 输出"Cls2"
            
//若找不到名为Cls2的类则抛出ClassNotFoundException
            Class.forName("Cls2");
            System.out.println(
"Inside Try");
        }

        
catch (ClassNotFoundException e)
        
{
            System.out.println(
"Can't find Cls2"); 
        }

        
new Cls2();
        System.out.println(
"After Create Cls2");
        

        
//测试通过反射创建对象
        if(args.length == 1)
        
{
            Object obj 
=  Class.forName(args[0]).newInstance();
        }


        
//显示任意对象的类层次
        Cls3 obj = new Cls3();
        showHierarchy(obj);

        
//测试静态成员是否能被继承  
        
//结果:无编译错误,可以被继承 且可以被实例对象调用 C#只能由类对象调用
        System.out.println(obj.flag);
    }


    
/**显示对象的类层次
    *
@author Jimmy
    *
@param Object with any type
    ×
@return No return value
    
*/

    
public static void showHierarchy(Object obj)
    
{
        Class cls 
= obj.getClass();
        System.out.println(cls.getName());

        
while(cls.getName() != "java.lang.Object")
        
{
            cls 
= cls.getSuperclass();
            System.out.println(cls.getName());
        }

    }

}


class Cls1
{
    
static
    
{
        System.out.println(
"Cls1");
    }

}


class Cls2
{
    
public static int flag = 1;
    
static
    
{
        System.out.println(
"Cls2");
    }

}


class Cls3 extends Cls2
{
    
public int tag;
}

 

Class.getDeclaredFields() 函数应用

 

/**显示类型对象的成员信息
    *
@author jimmy
    *
@param 类型对象
    *
@return void
    
*/

    
public static void showFields(Class cls)
    
{
        Field[] fields 
= cls.getDeclaredFields();

        
for(int i = 0; i < fields.length; i++)
        
{
            System.out.println(fields[i].getName());
        }

    }



//被测试类型 Cls2同前面代码段
class Cls3 extends Cls2
{
    
public int tag;
    
public static int stag;

    
public Cls3()
    
{

    }


    
public static void sshow()
    
{

    }


    
public void show()
    
{

    }

}


//调用代码
//尝试Class类中getDeclaredFields函数
        System.out.println("测试getDeclaredFields函数");
        showFields(Cls3.
class);

结果显示:

tag

stag

ps:可通过Cls3.class可获取该标识符对应的类型对象