浅析Java RTTI 和 反射的概念
一、概念
RTTI(Run-Time Type Identification,运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,怎么理解这个Class对象呢?如果说类是所有对象方法、属性的集合,那就可以把这个Class对象理解成是所有class的集合,然后利用这个Class对象动态的解析出相关类,并可以获得其构造器和方法等,甚至实例化这个类的对象。开始文章前,先提重要的一点:无论是RTTI还是反射,其本质都是一样的,都是去动态的获取类的信息,他们唯一的区别仅是:
- RTTI 在编译期知道要解析的类型。
- 反射 在运行期知道要解析的类型。
二、RTTI
有以下两种方式可以获取到Class对象:
public static void main(String[] args)
{
try {
//第一种方式
Class rtti = Class.forName("com.jomoo.test.rtti.RTTI");
//第二种方式
Class type=RTTI.class;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
可以看到,采用RTTI的方式必须在写程序的时候就知道了类的名字,才能获取到Class对象对这个类的引用,并利用这个引用,得到大量关于这个类的信息,包括接口,父类,方法,静态成员,甚至是像newInstance()方法这样的一个实现“虚拟构造器”的一种方式。
RTTI r =(RTTI)rtti.newInstance();//newInstance的类必须要有一个缺省构造器
另外需要提一个经常用到 instanceof 该关键字的调用其实就是使用了Class对象,并且返回一个布尔值。
Object o = rtti.newInstance();
if (o instanceof RTTI){
System.out.println(true);//这里需要注意的是,如果 o 是 RTTI的子类的话,返回的也会true;
}
三、反射
Java中有时候在编译器为程序生成代码很久之后才会出现要处理的那个类,那么这个时候怎么才能处理这个类呢,即在编译的时候根本无法获知这个对象所属的类。答案就是利用Java的反射机制。废话不多说,看完下面这个代码你就很清楚的明白 RTTI 和 反射的区别在哪里了。
public class RTTI
{
private static final String usage="usage";
private static Pattern pattern=Pattern.compile("\\w+\\."); public static void main(String[] args)
{
if (args.length<1){
System.out.println(usage);
System.exit(0);
}
int lines=0;
try {
Class c = Class.forName(args[0]);//看这里类的名字在编译的时候是无法得知的,只有在运行的时候动态传进去
Method[] method = c.getMethods();
Constructor[] constructors = c.getConstructors();
if (args.length==1){
for (int i=0;i<method.length;i++){
System.out.println(pattern.matcher(method[i].toString()).replaceAll(""));
}
for (int i=0;i<constructors.length;i++){
System.out.println(pattern.matcher(constructors[i].toString()).replaceAll(""));
}
lines=method.length+constructors.length;
}else {
for (int i=0;i<method.length;i++){
if (method[i].toString().indexOf(args[1])!=-1){
System.out.println(pattern.matcher(method[i].toString()).replaceAll(""));
}
lines++;
}
for (int i=0;i<constructors.length;i++){
if (constructors[i].toString().indexOf(args[1])!=-1){
System.out.println(pattern.matcher(constructors[i].toString()).replaceAll(""));
}
lines++;
}
}
} catch (ClassNotFoundException e) {
System.out.println("NO!!!!");
}
}
}
如何在main方法中带入参数可以参考这篇博客,我用原生的 javac -encoding UTF-8 RTTI.java 和 java RTTI com.jomoo.test.seven.ActionCharacter来运行 竟然报错了:Error: Could not find or load main class RTTI,我的JDK有毒!无奈借助了强大的IDE工具:
四、总结
其实 RTTI 的概念只是在《Thinking in Java》中提到的,才引来这么多人的讨论,原生的Java中并没有这个概念的说法。所以勒,我们根本不必纠结是 RTTI 还是反射,他们无论用法还是本质都是一样的,都是为了实现一样的目的——动态的获取类的信息,我们应该把重点放在使用上,而不要过多在纠结在差异上。
浅析Java RTTI 和 反射的概念的更多相关文章
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
- Java RTTI和反射
一.Java的RTTI RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类 ...
- 浅析Java中的反射机制原理
反射反射,程序员的快乐! Java中反射机制使用的还是比较广泛的,系统的灵活性.可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能.但是很多人都只是会用,却是不知道它的 ...
- RTTI和反射
JAVA 运行时识别对象和类的信息,主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型:另一种是"反射"机制,它允许我们在运行时发现和使用类的信息. 参考 ...
- Java RTTI and Reflection
Reference: Java编程思想 java 反射(Reflect) Java系列笔记(2) - Java RTTI和反射机制 Java Reflection in Action, 有空再补 -- ...
- Java RTTI机制与反射机制
1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...
- java的RTTI和反射机制
RTTI,即Run-Time Type Identification,运行时类型识别.RTTI能在运行时就能够自动识别每个编译时已知的类型. 很多时候需要进行向上转型,比如Base类派生出Derive ...
- Java类型信息(RTTI和反射)
要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...
- 【Java基础】RTTI与反射之Java
一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假 ...
随机推荐
- win32SDK的hello,world程序(二)
接上篇,原生的控件都不太好看,所以决定自己画一个,稍微处理下消息就能用了.不过,美化这东西是需要天赋的.即使技术再好,没有对UI布局调整和良好的审美能力,做出来的东西还是很挫. 主要把消息逻辑和画的过 ...
- JAVA 中数组的几种排序方法
1.数组的冒泡排序 public void bubbleSort(int a[]) { int n = a.length; for (int i = 0; i < n - ...
- co 模块
1.co 模块,它基于 ES6 的 generator 和 yield ,让我们能用同步的形式编写异步代码. 2.co 模块是能让我们以同步的形式编写异步代码的 nodejs 模块 3.学习网络地址: ...
- 20170722_php_单例模式
<?php class myClass{ private static $obj = null; private function __construc(){ } public static f ...
- 学会用requirejs,5分钟足矣
学会用requirejs,5分钟足矣 据说公司的项目较多的用到requirejs管理依赖,所以大熊同学挤出了5分钟休息时间学习了一下,现在分享一下.如果你想了解requirejs的实现原理,请绕道!如 ...
- jenkins - MultiJob使用
我们如果使用jenkins需要由串行,并行,传递参数和等待执行的功能的话,那我们会用到jenkins里面的两个东西:MultiJob和pipeline 这里我介绍下MultiJob的使用 实例任务的拓 ...
- 学习笔记TF031:实现VGGNet
VGGNet,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司一起研发,深度卷积神经网络.VGGNet反复堆叠3x3小型卷积核和2x2最大池化层, ...
- (转)IntelliJ IDEA 破解方法
1.下载破解包http://pan.baidu.com/s/1gf9fXx5 2.解压并打开选中的文件 3.如图 4.IDEA选择License Server输入 http://127.0.0.1:1 ...
- (转)VmWare下安装CentOS7图文安装教程
场景:克服安装Linux的恐惧,想装就装.在一篇博客中看到的,很有借鉴意义 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源 ...
- Kibana5 数据探索使用(Discover功能)
认识Kibana Kibana 是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作.Kibana的使用场景 ...