我有 2 个带有 getter 和 setter 的 POJO 类,现在我正在尝试获取该类的所有类实例变量。
我知道我们可以使用反射怎么做呢?
这是我的 POJO 类,它将扩展我的反射类。
class Details{
private int age;
private String name;
}
反射类是这样的:
class Reflection{
public String toString(){
return all the fields of that class
}
我有 2 个带有 getter 和 setter 的 POJO 类,现在我正在尝试获取该类的所有类实例变量。
我知道我们可以使用反射怎么做呢?
这是我的 POJO 类,它将扩展我的反射类。
class Details{
private int age;
private String name;
}
反射类是这样的:
class Reflection{
public String toString(){
return all the fields of that class
}
你可以这样做:
public void printFields(Object obj) throws Exception {
Class<?> objClass = obj.getClass();
Field[] fields = objClass.getFields();
for(Field field : fields) {
String name = field.getName();
Object value = field.get(obj);
System.out.println(name + ": " + value.toString());
}
}
这只会打印公共字段,以递归方式打印私有字段使用 class.getDeclaredFields。
或者,如果您要扩展该类:
public String toString() {
try {
StringBuffer sb = new StringBuffer();
Class<?> objClass = this.getClass();
Field[] fields = objClass.getFields();
for(Field field : fields) {
String name = field.getName();
Object value = field.get(this);
sb.append(name + ": " + value.toString() + "\n");
}
return sb.toString();
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
ClassLoader classLoader = Main.class.getClassLoader();
try {
Class cls = classLoader.loadClass("com.example.Example");
Object clsObject = cls.newInstance();
Field[] fields = cls.getFields();
for (Field field : fields) {
String name = field.getName();
Object value = field.get(clsObject);
System.out.println("Name : "+name+" Value : "+value);
}
System.out.println(cls.getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在上面的代码中再添加一行。如果您想访问该类的私有属性,请使用以下行
field.setAccessible(true);
上面提到的解决代码或答案有一个问题。要访问私有变量的值,其访问类型必须设置为 true
Field[] fields = objClass.getDeclaredFields();
for (Field field : fields) {
NotNull notNull = field.getAnnotation(NotNull.class);
field.setAccessible(true);
}
否则它会抛出java.lang.IllegalAccessException. 类反射不能访问带有修饰符“private”的类详细信息的成员