反射和RTTI的本质区别:
RTTI是在编译的时间检查和打开.class文件的,而反射是在运行时候打开和检查.class文件
一个是在编译是坚持类型信息,一个是在运行时坚持类型信息。
Class类与java。long.reflect类库一起对反射的概念进行了支持,包含了Method、Constructor
列:通过反射来拿到类中的方法(包括私有方法)
package com.package14.Two;
import java.lang.reflect.Method;
class Moo{
public void Sh1(){ };
private void Sh2(){
System.out.println("私有方法被调用");
};
}
public class ShowMetheds {
public static void main(String[] args) throws Exception {
Class<?> c=Class.forName("com.package14.Two.Moo");
Object o = c.newInstance();
//拿到该类中所有public的方法(包括Object)
for (Method method : c.getMethods()) {
System.out.println(method);
}
//拿到类中私有的方法c.getDeclaredMethods()方法只拿到目标类中的方法(包含私有方法)
for (Method declaredMethod : c.getDeclaredMethods()) {
if (declaredMethod.toString().contains("Sh2")){
//可以提高反射速度,原因是设置为true后则跳过了访问检查,即使private修饰的也可以访问。
declaredMethod.setAccessible(true);
declaredMethod.invoke(o);//调用了与Method对象关联的方法
}
}
}
}