Disabling compile-time dependency checking when compiling Java classes
bytecode, java, javac, jvm
Solution
Can you give any example for which it would be technically impossible to generate a valid Java class file without performing compile time dependency checking?
Consider this code:
public class GotDeps {
public static void main(String[] args) {
int i = 1;
Dep.foo(i);
}
}
If the target method has the signature `public static void foo(int n)`, then these instructions will be generated:
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iload_1
3: invokestatic #16; //Method Dep.foo:(I)V
6: return
If the target method has the signature `public static void foo(long n)`, then the `int` will be promoted to a `long` prior to the method invocation:
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iload_1
3: i2l
4: invokestatic #16; //Method Dep.foo:(J)V
7: return
In this case, it would not be possible to generate the invocation instructions or how to populate the `CONSTANT_Methodref_info` structure referred to in the class constant pool by the number 16. See the class file format in the VM spec for more details.
Problem
Consider the following two Java classes: ``` a.) class Test { void foo(Object foobar) { } } b.) class Test { void foo(pkg.not.in.classpath.FooBar foobar) { } } ``` Furthermore, assume that `pkg.not.in.classpath.FooBar` is not found in the classpath. The first class will compile fine using the standard javac. However, the second class won't compile and javac will give you the error message `"package pkg.not.in.classpath does not exist"`. The error message is nice in the general case since checking your dependencies allows the compiler to tell you if you got some method argument wrong, etc. While nice and helpful this checking of dependencies at compile-time is AFAIK not strictly needed to generate the Java class file in the example above. Can you give any example for which it would be technically impossible to generate a valid Java class file without performing compile time dependency checking? Do you know of any way to instruct javac or any other Java compiler to skip the compile time dependency checking? Please make sure your answer addresses both questions.