Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取类实例变量并使用反射打印它们的值_Java_Reflection - Fatal编程技术网

Java 获取类实例变量并使用反射打印它们的值

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

我有一个带有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 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);这应该是什么?什么样的东西?我多次尝试创建一个新对象,但都失败了。另外,如何访问某个字段的值并在条件语句中使用它?