Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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,如何迭代并获取不可实例化类的所有字段的值: import java.lang.reflect.Field; public class NonInstantiableClass { private Integer a1 = 1; private String a2 = "a"; private NonInstantiableClass () { throw new AssertionError(); } public static v

如何迭代并获取不可实例化类的所有字段的值:

import java.lang.reflect.Field;

public class NonInstantiableClass {
    private Integer a1 = 1;
    private String a2 = "a";

    private NonInstantiableClass () {
         throw new AssertionError();
    }

    public static void printVariables () throws IllegalAccessException {

        for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
            field.setAccessible(true);
            System.out.println(field.getName()
                    + " - " + field.getType()
                    + " - " + field.get(NonInstantiableClass.class));
        }
    }


    public static void main(String args[]) throws IllegalAccessException {
        NonInstantiableClass.printVariables();
    }
}
给定此代码,将获得以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.Integer field NonInstanciableClass.a1 to java.lang.Class
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.base/java.lang.reflect.Field.get(Field.java:418)
    at NonInstanciableClass.printVariables(NonInstanciableClass.java:17)
    at NonInstanciableClass.main(NonInstanciableClass.java:23)
如果类是可实例化的,则相同的代码适用于实例:

import java.lang.reflect.Field;

public class NonInstantiableClass {
    private Integer a1 = 1;
    private String a2 = "a";

    //private NonInstantiableClass () {
    //     throw new AssertionError();
    //}

    public static void printVariables () throws IllegalAccessException {

        for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
            field.setAccessible(true);
            System.out.println(field.getName()
                    + " - " + field.getType()
                    + " - " + field.get(new NonInstantiableClass()));
        }
    }


    public static void main(String args[]) throws IllegalAccessException {
        NonInstantiableClass.printVariables();
    }
}
有没有更好的方法来解决这个问题

谢谢

编辑:

正如Dylan指出的,如果类不可实例化,那么实例字段就无法初始化。当然,这些字段是静态的:

private static Integer a1 = 1;
private static String a2 = "a";
试试这个:

import java.lang.reflect.Field;

public class NonInstantiableClass {
    private static Integer a1 = 1;
    private static String a2 = "a";

    private NonInstantiableClass () {
         throw new AssertionError();
    }

    public static void printVariables () throws IllegalAccessException {

        for (Field field : NonInstantiableClass.class.getDeclaredFields()) {
            field.setAccessible(true);
            System.out.println(field.getName()
                    + " - " + field.getType()
                    + " - " + field.get(NonInstantiableClass.class));
        }
    }

    public static void main(String args[]) throws IllegalAccessException {
        NonInstantiableClass.printVariables();
    }
}

但这只会告诉您静态字段。如果字段不是静态的,getVariableValue将返回null。

谢谢您的回答,这很有趣,但它不会填充字段。使用例如
System.out.println(field.get(cl))打印其值获取空值。试着按照这个解决方案,我没有找到如何填充它们。哦!我不知道你在寻找他们的价值观,我的错。我也会尝试处理这个问题。我已经修复了它,它现在会给你值。如果这个类没有实例化,如何设置值?除new关键字外,还有其他实例化对象的方法,有些方法可以绕过构造函数。但最终你必须有一个对现有对象的引用,你是对的,Dylan,我的意思是静态构建它们。真丢脸,谢谢。我已经更新了我的答案,让它成为你现在想要的。