Class类与java.lang.reflect类库一起对反射的概念进行了支持,该类库包含了Field、Method以及Constructor类。这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员。所以可以使Constructor创建新的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke()方法调用Method()对象关联的方法。另外还可以调用getFields()、getMethods()和getConstructors()等方法,以返回表示字段、方法以及构造器的对象的数组。这样,匿名对象的类信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。
Class.forName()生成的结果在编译时不可知的。因此所有的方法特征签名信息都是在执行时被提取出来的。反射机制提供了足够的支持,使得能够创建一个在编译时完全未知的对象,并调用此对象的方法。
package com.sangyu.test.test21;
public class User {
private int id;
private String name;
private int age;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public User(){}
public User(int id,String name,int age){
this.id = id;
this.name = name;
this.age = age;
}
}
package com.sangyu.test.test01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ShowMethods {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> c = Class.forName("com.sangyu.test.test21.User");
Method[] methods = c.getMethods();
Constructor[] constructors = c.getConstructors();
for(Method method:methods){
System.out.println(method);
}
System.out.println("");
for(Constructor constructor:constructors){
System.out.println(constructor);
}
}
}
getMethods()和getConstructors()方法分别返回Method对象的数组和Constructor对象的数组。