java反射和RTTI

2017-11-18  本文已影响51人  SeaRise

在运行时识别对象和类的信息有两种方式:

Class对象

public class TestClass {

    public static void main(String[] args) {
        //System.out.println(XYZ.a);
        //System.out.println(XYZ.b);
        //new XYZ();
    }

}

class XYZ {
    final static int a = 5;
    
    static int b = 6;
    
    static {
        System.out.println("init");
    }
    
    public XYZ() {
        System.out.println("constructor");
    }
}

分别执行main方法中被注释的三行代码,结果如下:


image.png
image.png
image.png
获取Class对象的两种方法:

RTTI

反射

Class c = Class.forName("java.lang.Integer");  
        //获取所有的属性?  
      Field[] fs = c.getDeclaredFields();  
 
             //定义可变长的字符串,用来存储属性  
      StringBuffer sb = new StringBuffer();  
      //通过追加的方法,将每个属性拼接到此字符串中  
      //最外边的public定义  
      sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
      //里边的每一个属性  
      for(Field field:fs){  
          sb.append("\t");//空格  
          sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
          sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
          sb.append(field.getName()+";\n");//属性的名字+回车  
      }  

      sb.append("}");  

      System.out.println(sb);  
image.png
上一篇 下一篇

猜你喜欢

热点阅读