初识Java里RTTI和反射(二)

今天才突然发现,RTTI其实主要是C++里的说法和反射其实表达的意思差不多(反射主要是Java里对RTTI的一种实现),有一个主要的区别是,对RTTI来说,编译器会在编译期打开和检查class文件。但对“反射”来说,class文件在编译期间是不可使用的,而是由运行时环境打开和检查。

动机

一开始觉得动态获取某个类的类型信息好像觉得平时根本用不上,那到底反射他的使用场景是什么呢?我了解的场景有下:

  • 插件化构件的程序就会需要到这个强大的技术了。也就是新加的插件,本来不在原程序里,新的插件是从网络上下载下来,这个类不在原来的程序空间里。
  • 远程方法调用(RMI),它允许一个Java程序将对象分布到多台机器上。例如,你可能正在执行一项需要大量计算的任务,为了提高运算速度,想将计算划分到许多小的计算单元上。
  • 在Android里扩充Framework。如果厂家需要修改Framework,要在里面的某类里添加使用自定义的Jar包,使用该自定义Jar包的方法是用import,但是为保存和原生Framework的兼容性,对原生Framework的最少修改,可以使用ClassLoader动态加载自定义Jar包。

Reflect常用类方法介

  • Method

可以在获取某个Class对象包含的所有方法getMethods(),也可用getMethod(String name,Class<?>… parameterTypes)来获取特定的方法,例子如下:

Class clzz = Class.forName("DummyClass");
Method methods = clzz.getMethods();
for(Metho m : methos){
    m.toString();
}
// get the function name is "display",and the param type is Stirng
Method action = clzz.getMethod("display",String.TYPE);
// call this function
action.invoke("test");
  • getConstruct

getConstructs返回所有构造函数,getConstructor(Class<?>… parameterTypes)返回特定参数的构造函数。

 

考虑过几天敲一下,一个Android插件化构架的例子 : )

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>