使用反射获取程序运行时的对象和类的真实信息。
获取 Class 对象
每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类。
使用 Class 类的 forName(String clazzName) 静态方法。字符串参数的值是某个类的全限定类名,必须包含完整的包名
调用某个类的 class 属性
调用某个对象的 getClass() 方法。该方法是 java.lang.Object 类中的一个方法,所有的 Java 对象都可以调用,返回该对象所属类对应的 Class 对象
获取 Class 对象中信息
Class 类提供了大量的实例方法来获取该 class 对象所对应的类的详细信息。更多请参考 API。
import java.lang.reflect.*;
import java.lang.annotation.*;
public class ClassTest {
private ClassTest() {
}
public ClassTest(String name) {
System.out.println("执行有参数的构造器");
}
public void info() {
System.out.println("执行无参数的info方法");
}
public void info(String str) {
System.out.println("执行有参数的info方法" + ",其 str 参数值: " + str);
}
class Inner {
}
public static void main(String[] args) throws Exception {
Class clazz = ClassTest.class;
// 获取 clazz 对象所对应类的全部构造器
Constructor>[] ctros = clazz.getDeclaredConstructors();
System.out.println("ClassTest 的全部构造器如下: ");
for (Constructor c : ctros) {
System.out.println(c);
}
// 获取 clazz 对象所对应类的全部 public 构造器
Constructor>[] publicCtors = clazz.getConstructors();
System.out.println("ClassTest的全部public构造器如下:");
for (Constructor c : publicCtors) {
System.out.println(c);
}
// 获取 clazz 对象所对应类的全部 public 方法
Method[] mtds = clazz.getMethods();
System.out.println("ClassTest 的全部 public 方法如下: ");
for (Method md : mtds) {
System.out.println(md);
}
// 获取 clazz 对象所对应类的指定方法
System.out.println("ClassTest 里带一个字符串参数的 info 方法为:" + clazz.getMethod("info", String.class));
// 获取 clazz 对象所对应类的全部注解
Annotation[] anns = clazz.getAnnotations();
System.out.println("