java - 如何使用 LambdaMetaFactory 实例化对象?
问题描述
我有一个界面动作:
package action;
public interface Action {
public String act();
}
类 SimpleAction:
package action;
public class SimpleAction implements Action {
String action;
public SimpleAction() {}
public SimpleAction(String x) {
this.action = x;
}
@Override
public String act() {
return "Act method from -" + this.action;
}
}
类复杂动作:
package action;
public class ComplexAction implements Action{
String action;
public ComplexAction() {}
public ComplexAction(String x) {
this.action = x;
}
@Override
public String act() {
return "Act method from -" + this.action;
}
}
我想创建一个函数,它采用类的名称并返回该类的对象。这就是我迄今为止在我的职能中所拥有的 -
public static Action resultOfActMethod(String objclass){
Class clazz = Class.forName(objclass);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findConstructor(clazz,MethodType.methodType(void.class, String.class));
}
解决方案
弄清楚了。
public static Action resultOfActMethod(String objclass){
Class clazz = Class.forName(objclass);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findConstructor(clazz, MethodType.methodType(void.class, String.class));
Function<String, Action> constructor = (Function<String, Action>)LambdaMetafactory.metafactory(lookup, "apply",MethodType.methodType(Function.class),
mh.type().generic(), mh, mh.type()).getTarget().invokeExact();
Action action = constructor.apply(objclass);
return action;
}
推荐阅读
- python - 如何计算训练相似度矩阵的加权平均值
- c# - 构建器设计模式和使用从其他类继承的类有什么区别?
- r - 如何使用 R 在 Firefox 中伪造我的位置?
- python - 如何选择性地将参数传递给子进程?
- arrays - Firebase 替换整个数组返回“不支持的类型:__SwiftValue”
- mysql - 如何使数据库列成为另一列的函数
- apache-camel - Quarkus Camel SFTP 路由 Quartz 时间表未启动
- javascript - 每当我点击搜索按钮而没有在搜索字段中输入任何内容时,它都会带我进入 Duck Duck Go 的主页,我该如何禁用它?
- sublimetext3 - 为什么 Sublime Text3 不运行代码 webbrowser.open('URL')
- java - 如何将字符串数组列表存储到 Firebase 中?