小编Ale*_*man的帖子

使用 LambdaMetafactory 对从其他类加载器获取的类实例调用单参数方法

基于this stackoverflow answer,我试图使用反射实例化一个类,然后使用它调用一个单参数方法LambdaMetafactory::metafactory(我尝试使用反射,但它很慢)。

更具体地说,我想创建 的一个实例com.google.googlejavaformat.java.Formatter,并formatSource()使用以下签名调用其方法:String formatSource(String input) throws FormatterException.

我定义了以下功能接口:

@FunctionalInterface
public interface FormatInvoker {
  String invoke(String text) throws FormatterException;
}
Run Code Online (Sandbox Code Playgroud)

并试图执行以下代码:

try (URLClassLoader cl = new URLClassLoader(urls.toArray(new URL[urls.size()]))) {
  Thread.currentThread().setContextClassLoader(cl);

  Class<?> formatterClass =
      cl.loadClass("com.google.googlejavaformat.java.Formatter");
  Object formatInstance = formatterClass.getConstructor().newInstance();

  Method method = formatterClass.getMethod("formatSource", String.class);
  MethodHandles.Lookup lookup = MethodHandles.lookup();
  MethodHandle methodHandle = lookup.unreflect(method);
  MethodType type = methodHandle.type();
  MethodType factoryType =
      MethodType.methodType(FormatInvoker.class, type.parameterType(0));
  type = type.dropParameterTypes(0, 1);

  FormatInvoker formatInvoker = (FormatInvoker)
    LambdaMetafactory …
Run Code Online (Sandbox Code Playgroud)

java reflection lambda java-8 lambda-metafactory

4
推荐指数
1
解决办法
1527
查看次数

标签 统计

java ×1

java-8 ×1

lambda ×1

lambda-metafactory ×1

reflection ×1