java 通过反射获取类名和字段名称,以及字段的值
1.获取类名
import java.lang.reflect.Field;
public class ReflectionExample {
public static void main(String[] args) {
// 获取类名
Class<?> clazz = MyClass.class;
System.out.println("类名: " + clazz.getName()); // 全限定名(包括包名)
System.out.println("简单类名: " + clazz.getSimpleName()); // 简单类名(不包含包名)
}
}
class MyClass {
private String name = "John";
public int age = 30;
}
2.获取字段名称和值
import java.lang.reflect.Field;
public class ReflectionExample {
public static void main(String[] args) {
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
// 获取所有声明的字段(包括私有字段)
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 获取字段名称
String fieldName = field.getName();
System.out.println("字段名: " + fieldName);
try {
// 设置可访问性,即使是私有字段
field.setAccessible(true);
// 获取字段值
Object value = field.get(obj);
System.out.println("字段值: " + value);
}catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
class MyClass {
private String name = "John";
public int age = 30;
protected double salary = 5000.0;
}
3.完整示例
import java.lang.reflect.Field;
public class ReflectionDemo {
public static void main(String[] args) {
// 创建对象实例
Person person = new Person("Alice", 25, 60000.0);
// 获取Class对象
Class<?> personClass = person.getClass();
// 打印类信息
System.out.println("类全名: " + personClass.getName());
System.out.println("简单类名: " + personClass.getSimpleName());
System.out.println("\n字段信息:");
// 获取所有字段(包括私有字段)
Field[] fields = personClass.getDeclaredFields();
for (Field field : fields) {
try {
// 设置可访问性,即使是私有字段
field.setAccessible(true);
// 获取字段信息
String fieldName = field.getName();
Class<?> fieldType = field.getType();
Object fieldValue = field.get(person);
// 打印字段信息
System.out.println("字段名: " + fieldName);
System.out.println("字段类型: " + fieldType.getSimpleName());
System.out.println("字段值: " + fieldValue);
System.out.println("-------------------");
}catch (IllegalAccessException e) {
System.out.println("无法访问字段: " + field.getName());
e.printStackTrace();
}
}
}
}
class Person {
private String name;
public int age;
protected double salary;
public Person(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
}