[英]Field.set throws IllegalArgumentException
我试图在Java中为摆动对象做单向数据绑定,就像一个练习一样。 当前,对于扩展JTextComponent的swing对象,我添加了一个文档侦听器,该侦听器还更新了后备数据存储。
public class Binder {
Map<JComponent, Map.Entry<WeakReference, Field>> map = new WeakHashMap<>();
AutoDocumentListener adl;
public Binder() {
adl = new AutoDocumentListener();
}
public void bind(Object instance, String varName, JComponent element, String property) {
Field field;
try {
field = instance.getClass().getDeclaredField(varName);
field.setAccessible(true);
map.put(element,
new AbstractMap.SimpleEntry<WeakReference, Field>(new WeakReference(instance), field));
if (element instanceof JTextComponent) {
element = (JTextComponent) element;
Document eldoc = ((JTextComponent) element).getDocument();
eldoc.putProperty("origin", element);
eldoc.addDocumentListener(adl);
} else { }
} catch (NoSuchFieldException | SecurityException ex) {
Logger.getLogger(Binder.class.getName()).log(Level.SEVERE, null, ex);
}
}
class AutoDocumentListener implements DocumentListener {
@Override
public void insertUpdate(DocumentEvent evt) {
JTextComponent jc = (JTextComponent) evt.getDocument().getProperty("origin");
Map.Entry<WeakReference, Field> dataToUpdate = map.get(jc);
if (dataToUpdate != null) {
try {
Object data = jc.getText();
dataToUpdate.getValue().set(dataToUpdate.getKey(), data);
} catch (IllegalArgumentException | IllegalAccessException ex) {
Logger.getLogger(Binder.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@Override
public void removeUpdate(DocumentEvent evt) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
}
问题是,在下面的行中,我得到了一个IllegalArgumentException:
dataToUpdate.getValue().set(dataToUpdate.getKey(), data);
java.lang.IllegalArgumentException: Can not set java.lang.String field org.jbind.test.TestClass.data to java.lang.ref.WeakReference
据我在文档中看到的,对Field.set的调用是正确的。 因此,我不知道出了什么问题。
我使用以下代码调用该函数:
public class TestClass {
public String data = "Text1";
public void init() {
Binder binder = new Binder();
JTextField jtf = new JTextField(data);
binder.bind(this, "data", jtf, "");
jtf.setText("Text2");
System.out.println(data);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TestClass().init();
}
});
}
}
我认为您需要获取钥匙的价值
dataToUpdate.getValue().set(dataToUpdate.getKey().get(), data);
dataToUpdate.getKey()返回WeakReference,因此您尝试在WeakReference实例上设置“数据”字段。 您要在TestClass实例上设置“数据”字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.