一、Java的RTTI
RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类都对应一个Class对象(在编写并且编译后),这个对象被保存在这个类的同名class文件里。
RTTI的限制?显然它在编译时必须知道一个非常重要的东西:类名(甚至是全类名)
二、Java的反射
Java中有时候在编译器为程序生成代码很久之后才会出现要处理的那个类,那么这个时候怎么才能处理这个类呢,即在编译的时候根本无法获知这个对象所属的类。答案就是利用Java的反射机制。Java的反射与RTTI的区别就在于编译时不需要知道任何事情,匿名对象的信息在运行时确定下来就可以。
例如:
public class ShowMethods { private static String usage= "usage"+ "showMethods qualified.class.name\n"+ "To show all methods in class or:\n"+ "showMethods qualified.class.name word\n"+ "To search for methods involving 'word'"; private static Pattern p=Pattern.compile("\\w+\\."); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub if(args.length<1){ System.out.println(usage); System.exit(0); } int lines=0; try{ Class<?> c=Class.forName(args[0]); Method[] methods=c.getMethods(); Constructor[] ctors=c.getConstructors(); if(args.length==1){ for(Method method:methods) System.out.println(p.matcher(method.toString())); for(Constructor cotr:ctors) System.out.println(p.matcher(cotr.toString())); lines=methods.length+ctors.length; }else{ for(Method method:methods) if(method.toString().indexOf(args[1])!=-1){ System.out.println(method.toString()); lines++; } } for(Constructor ctor:ctors) if(ctor.toString().indexOf(args[1])!=-1){ System.out.println(p.matcher(ctor.toString()).replaceAll("")); lines++; } }catch(ClassNotFoundException e){ System.out.println("No such class"+e); } }在这个类编译时: javac ShowMethods.java
//这个时候完全不知道
Class<?> c=Class.forName(args[0]);中的args[0]的内容是什么。
运行时:java ShowMethods ShowMethods
此时第二个ShowMethods为参数传递进去,即运行时才获得了类型信息。这便是反射。