Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java8中的类对象获取方法引用_Java_Reflection_Java 8_Method Reference - Fatal编程技术网

从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");