基于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)