我有一个java程序的源代码,但我没有它的依赖项.是否可以编译使用无法解析的字段,类和方法的Java代码?如果没有,是否有一个程序或Eclipse插件会自动生成在编译期间无法解决的假类,变量和方法?请举例.
public class Main { public static void main(String[] args) { // ... UnknownClass.unknownMethod(); } }
我希望它使用方法unknownMethod()自动生成Class UnknownClass:
public class UnknownClass { public static void unknownMethod() {} }
但是不要在输出.jar中导出它
Is it possible to compile Java code that uses fields,classes and methods that can’t be resolved?
不可以.源代码的静态依赖项必须在编译时都可用.
If not,is there a program or Eclipse plugin that will automatically generate fake classes,variables and methods that can’t be resolved during the compilation?
AFAIK,没有.
事实上,我认为在技术上建立这样一个程序是不可能的.这将需要推断我们没有任何信息的类和方法的签名.我认为不可能准确地做到这一点;即足够准确,以使签名与真实类的实际签名相匹配.
(需要解决的一些问题是推断类的正确超类型,推断参数和方法结果的正确类型,推断方法是否具有变量,推断方法是否存在重载等等.这些问题很容易处理,有些肯定不是.)
But how did Bukkit did it with CraftBukkit.jar and Bukkit.jar? in Bukkit.jar,there are the method headers with no inner code,however when compiling your code for BUkkit.jar,it works with Craftbukkit.jar.
我想你已回答了自己的问题.类层次结构和方法标头位于提供的Bukkit JAR文件中.因此,不需要推断它们.
相比之下,您要求在这里做的是从干净的平板推断类层次结构和方法签名…以及使用它们的代码(您的源代码)隐含的一些约束.
这是一个例子:
UnknownClass c = ... c.method(42); c.method(42.0);
有多种不同的解决方案:
public class UnknownClass ... { void method(double arg) {...} } public class UnknownClass ... { int method(double arg) {...} } public class UnknownClass ... { void method(int arg) {...} void method(double arg) {...} } public class UnknownClass ... { void method(byte arg) {...} void method(double arg) {...} } public class UnknownClass ... { void method(double... arg) {...} }
等等.
问题:哪个是正确的;即与真实UnknownClass中的实际签名匹配的那个?