Java反射:框架设计的灵魂,Java中提供的运行时动态获取对象的信息的能力。
Java反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
String a = "java.lang.String";
//String a = "java.util.HashMap";
/**
* 获取Class对象的三种方式
* 1 Object ——> getClass();
* 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
* 3 通过Class类的静态方法:forName(String className)(常用)
*
* 三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
*/
// 根据一类的全名字符串来获得一个类的类对象
Class<?> clazz = Class.forName(a);
// 获得传递过来的类的所有方法
Method[] methods = clazz.getDeclaredMethods();
// String s = Arrays.toString(methods);
for (Method m: methods) {
System.out.println(m);
}
System.out.println("------------------------------------------");
// 获得类的所有属性
Field[] declaredFields = clazz.getDeclaredFields();
for(Field d : declaredFields) {
System.out.println(d);
}
System.out.println("-------------------------------------");
// 获得类的所有构造器
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
for (Constructor c : constructors) {
System.out.println(c);
}
}
}