Java反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取信息以及动态调用对象的方法的功能成为Java语言反射机制。
. 动态获取类信息,进一步实现需要的功能; . eg:Spring通过XML文件描述类的基本信息,使用反射机制动态装配对象;
. Class类型 . Constructor构造方法 . Method方法 . Field属性
(除了Class之外都位于java.lang.reflect包中)
对象.getClass()获取Class对象;
String string = “string”; Class class1 = string.getClass();
任何类名加class即可返回class实例;
Class class2 = studentTable.class;
Class类静态方法forName(String name)适用于通过类型获得Class实例,尤其是当类名为变量时。JDBC编程中获得驱动就是通过这个方法,其实我们早已经接触过反射了。
Class.forName(“com.mysql.jdbc.Driver”);
package 反射;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Part1 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String string = "string";
//对象名获取class实例
Class class1 = string.getClass();
//静态类名常量获取class实例
Class class2 = studentTable.class;
//forname获取class实例
try {
Class class3 = Class.forName("反射.studentTable");
//获取class中方法
Method[] method2 = class3.getMethods();
for (Method m : method2) {
System.out.println(m.getName());
}
//获取构造方法实例
Constructor<studentTable> constructor = class2.getConstructor(String.class);
studentTable studentTable = (studentTable)constructor.newInstance("hello");
System.out.println("==================");
System.out.println(studentTable);
System.out.println("==================");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
getName
getId
setName
setPassword
getPassword
setId
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
==================
反射.studentTable@6d06d69c
==================
反射作为Java不可或缺的一部分,使得Java具有了动态属性,对于框架的学习有着深入的指导作用。