- 什么是反射?
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和动态调用对象方法的功能称之为反射机制。
反射机制是很有用的技术,下面会有一些例子.
-
反射的应用
Spring 框架:IOC 控制反转
Hibernate 框架:关联映射等
白盒测试 -
相关的API
Class
类是程序的一部分,每一个类都有一个Class对象,换句话说,也即是每当编写并且编译了一个类的时候,就会产生一个Class对象.
Class没有公共构造方法,Class对象是在类加载的时候由JVM通过类加载机制自动加载的,因此不能显式的声明一个Class对象.Class 是反射的起源,要想操作类中的属性和方法,必须从获取 Class Object开始
Class的获取方式常见的有两种:
Object obj = new Object();
1:Class c1 = obj.getClass();
2:Class c2 = Object.class();
关于类的加载机制,这在校招面试时,也是一个经常问到的点.
JVM中类的加载,由类加载器和他的子类实现,类的加载是指把类的class文件中的数据读入内存,然后产生与加载类对应的class文件对象,然后在进入连接阶段…
再说回反射
a.反射的一些实例: 动态实例化
String ClassName="demo.ref.book";
String bookName = "gone with the wind";
//------------以上的数据可能来自远方,比如数据库,文件,网络等,反正就是不在程序中-----
//如果要对数据进行修改,事先不知道要修改的类,就不能直接new一个类的对象,这就需要用到反射
Class c = Class.forName(ClassName);
Object obj = c.newInstance();
Book bo = (Book) obj;
bo.setName(bookName);
b.动态调用方法
//-----------------------------/
String ClassName = "demo.ref.Student";
String method = "setId";
String parameterType = "java.lang.String";
String val = "tom";
//------------------------------/
//通过反射获取方法,上面的数据也是来自远方
//其中 Student类是一个JavaBean,有set和get方法
//下面的代码可以直接写死
Class c = Class.forName(ClassName);
//mts[]中是所有的方法
Method mts[] = c.getDeclaredMethods();
for(Method m:mts){
System.out.println(m);
}
//下面获取指定的方法
Object obj = c.newInstance();
Method mt = c.getMethod(method,new Class[]{parameterType });
mt.invoke(obj,val);//唤醒,运行
//上述代码会有异常,直接抛出