从Java8中的类对象获取方法引用
我的工厂类不知道我通过运行时输入获得的类名 目前我有一个解决方案,可以使用反射在我的工厂类中创建这些类的实例,但是我想看看是否可以将这些类的方法引用从Java8中的类对象获取方法引用,java,reflection,java-8,method-reference,Java,Reflection,Java 8,Method Reference,我的工厂类不知道我通过运行时输入获得的类名 目前我有一个解决方案,可以使用反射在我的工厂类中创建这些类的实例,但是我想看看是否可以将这些类的方法引用new传递给我的工厂类,这样我就不需要使用反射了。e、 g: public interface MyFactory { MyClass getInstance(String s); } public static MyFactory getRuntimeClass(Class<? extends MyClass> cls) {
new
传递给我的工厂类,这样我就不需要使用反射了。e、 g:
public interface MyFactory {
MyClass getInstance(String s);
}
public static MyFactory getRuntimeClass(Class<? extends MyClass> cls) {
return cls::new;
}
public static void main(String[] args) {
MyClass mySubClass = getRuntimeClass(Class.forName(args[0]).asSubClass(MyClass.class)).getInstance("test");
}
公共接口MyFactory{
MyClass getInstance(字符串s);
}
公共静态MyFactory getRuntimeClass(Class嗯,使用运行时指定的类型(即编译时未知的类型)是反射的定义。没有反射就不能执行反射操作
您可以做的是生成函数接口的实例,该实例可以在不使用反射的情况下实例化类,即在调用接口方法之前解决所有问题,就像在编译时对已知成员的方法引用在运行时起作用一样:
public static MyFactory getRuntimeClass(Class<? extends MyClass> cls) {
try {
MethodHandles.Lookup l = MethodHandles.lookup();
MethodHandle c = l.findConstructor(cls,
MethodType.methodType(void.class, String.class));
MethodType ft = c.type().changeReturnType(MyClass.class);
return (MyFactory)LambdaMetafactory.metafactory(l, "getInstance",
MethodType.methodType(MyFactory.class), ft, c, ft).getTarget().invokeExact();
}
catch(RuntimeException | Error t) {
throw t;
}
catch(Throwable t) {
throw new IllegalArgumentException(t);
}
}
可以像这样使用
MyClass mySubClass = MY_FACTORIES.get(Class.forName(args[0])).getInstance("test");
我认为您误解了方法引用是什么。只需使用您的标准反射,Class#newinstance
cls::new
尝试获取对Class
的构造函数的引用。它失败了,因为Class
没有接受单个字符串
参数的公共构造函数。没有任何方法可以使用方法引用需要什么。我建议按照@SotiriosDelimanolis的建议去做。@Sotirios Delimanolis:Class。newInstance
只支持默认构造函数。
MyClass mySubClass = MY_FACTORIES.get(Class.forName(args[0])).getInstance("test");