访问对象';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)
,现在它开始工作了。请写一个答案,我会为你接受:)