java动态确定当前正在执行的类

时间:2018-02-03 00:58:44

标签: java serialization reflection lambda

我正在尝试编写一个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()

1 个答案:

答案 0 :(得分:1)

通过将lambda从Runnable更改为Consumer<MySquare>

来对其进行排序

e.g。 Consumer<MySquare> r = (sq) -> {sq.setColor(Color.BLACK)}

并将runRunnable()方法更改为现在执行r.accept(this)