java RTTI和反射

在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型;还有一种,是利用反射机制,在运行时再尝试确定类型信息。 

一、RTTI

Java中的每一个类都对应着一个Class对象(java.lang.Class)。通过这个Class对象你可以在运行时得到很多类中的有用的信息。用Class.forName来得到一个Class对象。

传统的RTTI有3种实现方式: 
1、向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子类)需要强制类型转换 
2、Class对象(用了Class对象,不代表就是反射,如果只是用Class对象cast成指定的类,那就还是传统的RTTI) 
3、instanceof或isInstance() 


举例:

  1. try {
  2.     Class c = Class.forName("MyClass");
  3.     String name = c.getName(); // "MyPackge.MyClass"
  4.     name = c.getSimpleName(); // "MyClass"
  5.     name = c.getCanonicalName(); // "MyPackge.MyClass"
  6.     Class superClass = c.getSuper();
  7.     if (superClass != null) // Object's super class is null
  8.         superClass.newInstance();
  9.     boolean b = c.isInterface();
  10.     for(java.lang.Class face: c.getInterfaces())
  11.         name = face.getName();
  12. } catch (ClassNotFoundException) {}
 
  1. 二、反射机制
  2. Java还有一套反射机制。RTTI能够维护的类型都是编译时已知的类型,而反射可以使用一些在编译时完全不可知的类型。比如在进行一个远程调用时,类信息是通过网络传输过来的,编译器在编译时并不知道这个类的存在。Java的反射与RTTI的区别就在于编译时不需要知道任何事情,匿名对象的信息在运行时确定下来就可以。
  3. 举例:
    1. class SomeClass {
    2. public SomeClass() {}
    3. public int SomeMethod(double d, char c) { return 2; }
    4.     public int a;
    5. }

    6. public class ReflectTest {
    7.     public static void main(String[] args) {
    8.         Class c = Class.forName("SomeClass");
    9.         for (Constructor<?> constructor: c.getConstructors())
    10.             System.out.println(constructor);
    11.         for (Method method: c.getMethods())
    12.             System.out.println(method);
    13.         for (Field field: c.getFields())
    14.             System.out.println(field);
    15.                     
    16.         SomeClass sc = new SomeClass();
    17.         Method method = c.getMethod("SomeMethod", double.class, char.class);
    18.         Integer returnedValue = (Integer)method.invoke(sc, 3, '4');
    19.         Field field = c.getField("a");
    20.         int value = field.getInt(sc);
    21.         System.out.println(value);
    22.     }
    23. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值