Extrait de code java simple. Il a trois classes. Après avoir compilé le code, supprimez A.class, puis exécutez le code. Le code fonctionne toujours, pourquoi ne vérifie pas si le code d'octet de A existe ou non?Comportement du compilateur Tricky
class A {
static {
System.out.println("In the class A");
}
public A() {
}
}
class B {
private A a = null;
static {
System.out.println("In the class B");
}
public B() {
a = new A();
}
}
public class ExampleLinkage {
static {
System.out.println("In the class A");
}
public ExampleLinkage(String str) {
}
public static void main(String args[]) {
try {
System.out.println("In the main method of ExampleLinkage");
Class.forName("com.bt.rtti.B");
} catch(Exception e) {
e.printStackTrace();
}
}
}
Notez que rien ne décrit ici le comportement délicat du compilateur. Vous ne comprenez pas –
Son discutable.Mais je ne suis pas sûr du comportement correct du compilateur.Il pourrait être le cas de faire une certaine optimisation et ne pas ajouter le code d'octet pertinent de classe A. – Neeraj
Non, le compilateur Java généralement ne fait quasiment pas d'optimisations et je suis à peu près sûr qu'il ne fait pas celui-là (d'autant qu'il ne serait pas valide de toute façon)). Vous pouvez facilement réfuter cette hypothèse en décompilant 'B.class' avec javap:' javap -v B' –