反射API方法的说明:
Class.forName("className")
:
Class<?> stringClass = Class.forName("java.lang.String");
clazz.getConstructor(Class<?>... parameterTypes)
:
Constructor<?> stringConstructor = stringClass.getConstructor(String.class);
constructor.newInstance(Object... initargs)
:
String greeting = (String) stringConstructor.newInstance("Hello, World!");
clazz.getDeclaredField(String name)
:
Field stringValueField = stringClass.getDeclaredField("value");
field.setAccessible(true)
:
stringValueField.setAccessible(true);
field.get(Object obj)
:
char[] charArray = (char[]) stringValueField.get(greeting);
clazz.getDeclaredMethod(String name, Class<?>... parameterTypes)
:
Method lengthMethod = stringClass.getDeclaredMethod("length");
method.invoke(Object obj, Object... args)
:
int length = (int) lengthMethod.invoke(greeting);
clazz.getSuperclass()
:
Class<?> superClass = stringClass.getSuperclass();
clazz.getInterfaces()
:
Class<?>[] interfaces = stringClass.getInterfaces();
clazz.getModifiers()
:
int modifiers = stringClass.getModifiers();
Modifier.isPublic(int modifiers)
:
boolean isPublic = Modifier.isPublic(modifiers);
这些API方法允许您在运行时检查和操作类的构造器、字段、方法、父类、接口和修饰符信息,从而实现了反射的核心功能。通过这些方法,您可以在运行时动态处理类的结构和实例。
import java.lang.reflect.*;
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
// 通过类的全名获取Class对象
Class<?> stringClass = Class.forName("java.lang.String");
// 获取String类的有参构造器
Constructor<?> stringConstructor = stringClass.getConstructor(String.class);
// 使用构造器创建一个String对象
String greeting = (String) stringConstructor.newInstance("Hello, World!");
// 获取String类的私有字段
Field stringValueField = stringClass.getDeclaredField("value");
// 设置私有字段为可访问
stringValueField.setAccessible(true);
// 获取字段的值(字符数组)
char[] charArray = (char[]) stringValueField.get(greeting);
// 获取String类的length()方法
Method lengthMethod = stringClass.getDeclaredMethod("length");
// 调用length()方法获取字符串的长度
int length = (int) lengthMethod.invoke(greeting);
// 获取String类的父类
Class<?> superClass = stringClass.getSuperclass();
// 获取String类实现的接口
Class<?>[] interfaces = stringClass.getInterfaces();
// 检查String类的修饰符
int modifiers = stringClass.getModifiers();
boolean isPublic = Modifier.isPublic(modifiers);
// 输出结果
System.out.println("Class Name: " + stringClass.getName());
System.out.println("Superclass Name: " + superClass.getName());
System.out.println("Implemented Interfaces: ");
for (Class<?> iface : interfaces) {
System.out.println(" " + iface.getName());
}
System.out.println("Is Public Class: " + isPublic);
System.out.println("Field Value: " + new String(charArray));
System.out.println("String Length: " + length);
}
}