【问题标题】:Instantiating a class via reflection using a constructor with a functional interface使用具有功能接口的构造函数通过反射实例化类
【发布时间】:2021-05-15 17:06:37
【问题描述】:

如果我有一个类,它里面有一个私有接口,它有@FunctionalInterface 注释,以及一个私有构造函数,它接受一个实现这个接口的类的实例,我如何使用反射构造这个对象所述接口的自定义实现?例如:

public class mcve {
  private mcve(mcve.wrapper<String> wrp1, mcve.wrapper<String> wrp2) {
    // ...
  }
  private mcve(mcve.wrapper<String> wrp1) {
    // ..
  }
  public static final mcve INSTANCE_1 = new mcve(ClassExtendsString::new, ClassExtendsString::new);
  public static final mcve INSTANCE_2 = new mcve(ClassExtendsString2::new, ClassExtendsString2::new);
  @FunctionalInterface
  interface wrapper<O> {
    O wrap(O object) throws Exception;
  }
}

还有一些代码试图完成我想要的:

 Constructor<mcve> constructor;
 constructor = mcve.class.getDeclaredConstructor(??.class);
 constructor.setAccessible(true);
 mcve testInstance = constructor.newInstance(?? MyCustomClassExtendingString::new);

我该如何进行?编译器抱怨Object 不是功能接口。我不确定要传递给getDeclaredConstructornewInstance

【问题讨论】:

  • 为什么要在这里使用反射?
  • 假设我不能修改 `mcve'。
  • @KamilaSzewczyk 你为什么要传递 MyCustomClassExtendingString::new ?你可以传递对象本身new MyCustomClassExtendingString()

标签: java reflection


【解决方案1】:

啊。您必须将其显式转换为 wrapper:

mvce testInstance = constructor.newInstance((wrapper<String>) MyCustomClassExtendingString::new);

【讨论】:

  • 如果wrapper 不可见,那么您必须竭尽全力才能完成这项工作:您需要编写MethodHandleProxies.asInterfaceInstance(Class.forName("com.whatever.mcve.wrapper"), MethodHandles.lookup().findConstructor(MyCustomClassExtendingString.class, MethodTypes.methodType(void.class, String.class)))。不用说,这很荒谬,你真的应该尽量避免反射或扩展字符串(?!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多