Method.invoke 不适用于 package-private 类



我有一个扩展AbstractTableModelModel的类TableModelBase。在那里,我重写了 getValueAt 方法,以便它返回行类的 getter 结果。

表模型库.java

@Log
@AllArgsConstructor
public abstract class TableModelBase<T> extends AbstractTableModel{
@NonNull private final String[] columns;
@NonNull protected final transient List<T> rows;
//...
/**
* Default getValue method.<br>
* The row type fields must be in the same sequence that the columns.<br>
* Getter methods must follow the getter convention.
* @param rowIndex The row index.
* @param columnIndex The column index matches the field index of the row type.
* @return Object
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
final T row = rows.get(rowIndex);
if(row.getClass().getDeclaredFields().length != getColumnCount()) {
for (Field field : row.getClass().getDeclaredFields()) {
System.out.println(field.getName());
}
log.severe("Fields number and table columns number are different in: " + row.getClass().getSimpleName());
System.exit(1);
}
final Field field = row.getClass().getDeclaredFields()[columnIndex];
String getter;
if(field.getType().equals(boolean.class)) {
getter = field.getName();
}
else {
getter = "get" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
}
try {
Method method = row.getClass().getMethod(getter);
return method.invoke(row);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
log.severe(e.getMessage());
System.exit(1);
return null;
}
}
}

我有一个测试类 表模型测试在包表模型中。在这个包中还有类 Data 和 DataModel。

数据.java

@Value
class Data {
String text = "text";
boolean isSuccessful = true;
}

数据模型.java

class DataModel extends TableModelBase<Data> {
DataModel() {
super(new String[]{"Text", "Is Successful"}, new ArrayList<>());
rows.add(new Data());
}
}

表模型基础测试

public class TableModelBaseTest {
@org.junit.Test
public void getValueAt() {    
final DataModel dataModel = new DataModel();
assertEquals("text",dataModel.getValueAt(0, 0));
assertEquals(true, dataModel.getValueAt(0, 1));
}
}

该测试给出了一个 IllegalAccessException:

Class com.dsidesoftware.tablemodel.TableModelBase 无法访问 类表模型的成员。带有修饰符"公共"的数据

getters是公开的,为什么我无法访问它们?
奇怪的是,当我公开数据时,例外就消失了。

知道发生了什么吗?

谢谢。

我怀疑这与 Data 类中的字段是包私有的有关。如果您想规避此问题,只需在获得任何java.lang.reflect.AccessibleObject实例(即您的情况下的字段和方法(上立即调用setAccessible(true);。这将使对它们的get()调用忽略安全检查。

最新更新