Java 获取类实例变量并使用反射打印它们的值
我有一个带有getter和setter的2个POJO类,现在我正在尝试获取该类的所有类实例变量 我知道我们可以使用反射,怎么做 这是我的POJO类,它将扩展我的反射类Java 获取类实例变量并使用反射打印它们的值,java,reflection,Java,Reflection,我有一个带有getter和setter的2个POJO类,现在我正在尝试获取该类的所有类实例变量 我知道我们可以使用反射,怎么做 这是我的POJO类,它将扩展我的反射类 class Details{ private int age; private String name; } 反射类是这样的: class Reflection{ public String toString(){ return all the fields of that class } public void pr
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 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());
}
}
public void打印字段(Object obj)引发异常{
类objClass=obj.getClass();
Field[]fields=objClass.getFields();
用于(字段:字段){
字符串名称=field.getName();
对象值=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;
}
}
公共字符串toString(){
试一试{
StringBuffer sb=新的StringBuffer();
类objClass=this.getClass();
Field[]fields=objClass.getFields();
用于(字段:字段){
字符串名称=field.getName();
对象值=field.get(此);
sb.append(name+”:“+value.toString()+”\n”);
}
使某人返回字符串();
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
上述解决方案代码或答案有一个问题。
要访问私有变量的值,其访问类型必须设置为true
Field[] fields = objClass.getDeclaredFields();
for (Field field : fields) {
NotNull notNull = field.getAnnotation(NotNull.class);
field.setAccessible(true);
}
否则它将抛出
java.lang.IllegalAccessException
。类反射无法访问带有修饰符“private”的类详细信息的成员在上述代码中再添加一行。如果您想访问类的私有属性,请使用下面的行
字段。setAccessible(true) 你看过任何反射教程或文档吗?是的,我看过了。你可以参考我的pojo Classis。如果你想使用反射创建一个新实例,请参考此->确定,但我可以覆盖toString方法并以同样的方式执行吗?这将返回所有字段?当然,您必须将名称/值附加到字符串中,而不是将其打印出来,并且还需要对反射类中的Details类的实例进行引用。如果我扩展其中包含toString方法的类并打印所有字段名,我将告诉您我正在尝试做什么。。。但问题是toString是一个内置方法,无法向其传递任何参数,因此,细节扩展了反射?如果有,用这个替换obj。@Mast3rPlan我不能正确理解这部分:Object value=field.get(this);这应该是什么?什么样的东西?我多次尝试创建一个新对象,但都失败了。另外,如何访问某个字段的值并在条件语句中使用它?