我正在尝试编写一个Serializable lambda,它可以调用运行它的对象实例中的方法。
我将把这个lambda传递给将要运行它的对象实例,在实例化之后立即执行它,但是因为我想序列化包含lambdas的这些对象,我需要一种动态确定对它的引用的方法对象实例。
如果currentClass()方法存在,我想做的就是这里。
Runnable r = (Runnable & Serializable)() -> {
try {
// currentClass() doesn't exist
Class curClass = Thread.currentThread().currentClass();
Method setCol = curClass.getMethod("setColor", Class.forName("Color"));
setCol.invoke(curClass, Color.BLACK);
} catch (NoSuchMethodException e | ClassNotFoundException e
| IllegalAccessException e | IllegalArgumentException e
| InvocationTargetException e) {
e.printStackTrace();
}
}
MySquare sq = new MySquare();
sq.setRunnable(r);
sq.runRunnable(); // calls r.run()
为了澄清,我想序列化sq
。
然后,当我从.ser文件中重新创建sq
时,我希望能够执行sq.runRunnable()
答案 0 :(得分:1)
通过将lambda从Runnable
更改为Consumer<MySquare>
e.g。 Consumer<MySquare> r = (sq) -> {sq.setColor(Color.BLACK)}
并将runRunnable()
方法更改为现在执行r.accept(this)