如何使用动态创建的 class 作为泛型?
How can I use a Dynamically created class as Generics?
我的问题是我确实有一个在运行时创建、编译和初始化的 class。我这样做是因为将文件写为 TestClass 即文件 f,
然后编译:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null,null,null,f.getPath());
之后,我加载 class 并根据此示例使用我的方法等;
http://viralpatel.net/blogs/java-dynamic-class-loading-java-reflection-api/
现在我的问题是我需要这样做:
MyTask<T> m = new MyTask<T>(0,0,0);
T 应该是我动态创建的 class 而不是 Integer.class 等。但是我还没有找到解决方法。如果您确实检查了我在上面给出的 link 中的示例,您会看到我可以有一个 class 对象形式的实例,并且我可以有一个 Class 动态 Class 实例=25=]。但是,无论我尝试过什么,我都找不到解决方案。
一直说ClassmyClass,不能作为类型。那么我如何使用这个动态创建的 class 作为类型。非常感谢。
您不能,因为通用类型信息仅在 编译 时可用。当您在运行时创建 class 时,任何地方都不再有可用的通用信息。
如果您的 class 实现了一个接口,您应该将其用作代码中的类型。类似于
MyInterface foo = myDynamicClass.newInstance();
someGenericMethod(foo);
public <T extends MyInterface> void someGenericMethod(T param) {}
// Or more likely, if there's no other classes that extend MyInterface
public void someGenericMethod(MyInterface param) {}
当然,即使使用通用类型信息也可能没有任何意义,因为它用于 static 类型检查,而您正在使用 动态 class.
没有有效的方法可以在源代码中表达编译时不存在的类型。无论如何,它不会比使用 Object
作为类型参数能做的更多,因为 Java 泛型提供 compile-time 类型检查,而不是 运行-时间类型检查。
可能您的目的可以通过创建一个您的动态 class 将实现的接口来实现,并使用该接口类型作为您的类型参数。
我的问题是我确实有一个在运行时创建、编译和初始化的 class。我这样做是因为将文件写为 TestClass 即文件 f, 然后编译:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null,null,null,f.getPath());
之后,我加载 class 并根据此示例使用我的方法等; http://viralpatel.net/blogs/java-dynamic-class-loading-java-reflection-api/
现在我的问题是我需要这样做:
MyTask<T> m = new MyTask<T>(0,0,0);
T 应该是我动态创建的 class 而不是 Integer.class 等。但是我还没有找到解决方法。如果您确实检查了我在上面给出的 link 中的示例,您会看到我可以有一个 class 对象形式的实例,并且我可以有一个 Class 动态 Class 实例=25=]。但是,无论我尝试过什么,我都找不到解决方案。
一直说ClassmyClass,不能作为类型。那么我如何使用这个动态创建的 class 作为类型。非常感谢。
您不能,因为通用类型信息仅在 编译 时可用。当您在运行时创建 class 时,任何地方都不再有可用的通用信息。
如果您的 class 实现了一个接口,您应该将其用作代码中的类型。类似于
MyInterface foo = myDynamicClass.newInstance();
someGenericMethod(foo);
public <T extends MyInterface> void someGenericMethod(T param) {}
// Or more likely, if there's no other classes that extend MyInterface
public void someGenericMethod(MyInterface param) {}
当然,即使使用通用类型信息也可能没有任何意义,因为它用于 static 类型检查,而您正在使用 动态 class.
没有有效的方法可以在源代码中表达编译时不存在的类型。无论如何,它不会比使用 Object
作为类型参数能做的更多,因为 Java 泛型提供 compile-time 类型检查,而不是 运行-时间类型检查。
可能您的目的可以通过创建一个您的动态 class 将实现的接口来实现,并使用该接口类型作为您的类型参数。