反射
反射当中最重要的内容—检查类的结构
现在我们来介绍获取类结构的相关方法:
- Field类 关于类的成员变量
- Method 关于类的方法
- Constucotr 类的构造器
这三个类首先同时有一个叫做getName()的方法,用来返回属性、方法、或构造器的名称。
下面展示一些 getName方法的使用
。
try {
//1.使用forName的方式获取Class类对象
Class<?> c = Class.forName("com.reflection.Student");
Field id = c.getField("id"); //这里只能获取到公共的成员属性
String name = id.getName();
System.out.println("该属性的名称:" + id);
} catch (Exception e) {
e.printStackTrace();
}
Class类中的
public Field[] getFields()
public Method[] getMethods()
public Constructor[] getConstructors
分别用于返回这个类支持的公共属性、方法、构造器的数组,包括了父类的公共成员
getDeclaredFields()
getDeclaredMethods()
getDeclaredConstructors()
这三个方法将会返回类中声明的全部属性、方法和构造器的数组,其中包括了私有的、受保护的成员,但是不包括父类的属性和行为
package com.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
自定义类的要求:
能够有私有的(private)公有的(public) 属性以及方法和构造器
*/
public class ClassTest5 {
public static void main(String[] args) {
//获取Student类对应的Class类对象
Class<Student> c = Student.class;
//演示getFields getMethods getConstructors方法
//可以根据自己的喜爱 自定义类
Field[] fields = c.getFields();
for (Field field : fields) {
System.out.println("该类公有的属性有:" + field); //包括父类的全部公有属性
}
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println("该类公有的方法有:" + method); //以及父类
}
Constructor<?>[] constructors = c.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println("类公有的构造方法有:" + constructor);
}
}
}
package com.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassTest6 {
public static void main(String[] args) {
Class<Student> c = Student.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println( "类当中的所有属性:" + field);
}
Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
Constructor<?>[] constructors = c.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
}
}
小结
这一章介绍了如何使用Class当中的方法来获取类的结构,需要注意的就是这些方法的不同之处,初学者如果有更多的兴趣可以查看API,这里我们只会介绍最重要的一些方法。