访问对象';Java中的s字段值-无法访问类Java.lang.IllegalAccessException的成员

访问对象';Java中的s字段值-无法访问类Java.lang.IllegalAccessException的成员,java,generics,reflection,Java,Generics,Reflection,我试图使用泛型来访问对象的字段 public static <T> String[] getFieldNames(T object, String[] avoidTheseFields) { Field[] fields = object.getClass().getDeclaredFields(); String[] fieldNames = new String[fields.length - avoidTheseFields.length]; List&

我试图使用泛型来访问对象的字段

public static <T> String[] getFieldNames(T object, String[] avoidTheseFields) {
    Field[] fields = object.getClass().getDeclaredFields();
    String[] fieldNames = new String[fields.length - avoidTheseFields.length];
    List<String> avoidTheseNamesList = Arrays.asList(avoidTheseFields);
    int i = 0;
    for(Field field : fields) {
        String fieldName = field.getName();
        if(avoidTheseNamesList.contains(fieldName))
            continue;
        fieldNames[i] = fieldName;
        i++;
    }
    return fieldNames;
}
例如,如果我有一个名为
myObject
的对象,并且我知道它的大多数字段都是数据类型
float
。所以当我调用这个函数时,
getFieldValuesFloat(myObject,新字符串[]{“id”})

然后我得到了这个错误:

java.lang.IllegalAccessException: class se.danielmartensson.tools.GetClassInformation cannot access a member of class se.danielmartensson.entities.LX_Current with modifiers "private"
以下是我遇到问题的代码:

public static <T> Float[] getFieldValuesFloat(T object, String[] avoidTheseFields) {
    String[] fieldNames = getFieldNames(object, avoidTheseFields);
    Float[] fieldValues = new Float[fieldNames.length];
    int i = 0;
    for(String fieldName : fieldNames) {
        try {
            Field field = object.getClass().getDeclaredField(fieldName);
            fieldValues[i] = field.getFloat(object);
            i++;
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return fieldValues;
}
这很奇怪,因为我使用这个方法来获取字段名。这种方法是有效的。它也使用泛型,但我只从对象读取字段名

public static <T> String[] getFieldNames(T object, String[] avoidTheseFields) {
    Field[] fields = object.getClass().getDeclaredFields();
    String[] fieldNames = new String[fields.length - avoidTheseFields.length];
    List<String> avoidTheseNamesList = Arrays.asList(avoidTheseFields);
    int i = 0;
    for(Field field : fields) {
        String fieldName = field.getName();
        if(avoidTheseNamesList.contains(fieldName))
            continue;
        fieldNames[i] = fieldName;
        i++;
    }
    return fieldNames;
}
publicstaticstring[]getFieldNames(T对象,String[]avoidTheseFields){
Field[]fields=object.getClass().getDeclaredFields();
String[]fieldNames=新字符串[fields.length-avoidTheseFields.length];
List AvoidTheNamesList=数组.asList(avoidTheseFields);
int i=0;
用于(字段:字段){
字符串fieldName=field.getName();
if(避免名称列表包含(字段名))
继续;
字段名[i]=字段名;
i++;
}
返回字段名;
}
问题:


如何使用泛型从任意类获取所有值?

此异常会通知您有某个具有私有访问级别的字段,并且您无法更改该字段的值。您应该通过以下命令更改访问级别:

字段。setAccessible(true)


然后尝试更改其值。

此异常会通知您某些字段具有专用访问级别,您无法更改该字段的值。您应该通过以下命令更改访问级别:

字段。setAccessible(true)


然后尝试更改其值。

该字段可能无法访问,您可以通过

并通过
进行更改

该字段可能无法访问,您可以通过

并通过
进行更改

id
private
的声明吗?您是否检查了字段并通过@大卫:是的。我是JPA实体类的标识键。@luk2302我会试试看!给我一点时间。@luk2302我添加了
field.setAccessible(true)
,现在它开始工作了。请写一个答案,我将为您接受:)是
id
private
的声明吗?您是否检查了字段并通过@大卫:是的。我是JPA实体类的标识键。@luk2302我会试试看!给我一点时间。@luk2302我添加了
field.setAccessible(true)
,现在它开始工作了。请写一个答案,我会为你接受:)