小编典典
一旦代码被编译, 就没有内部类之类的东西 。如果查看的结果javac,则会看到两个文件:
A.class
A$B.class
因此,类B在加载时A不会加载,B只是 碰巧 在中定义了A。
编辑
例如,鉴于这两个文件,
package kuporific;
public class A {
private static class B {}
private class C {}
}
和一个build.gradle文件(为方便起见):
apply plugin: 'java'
首先,通过运行进行构建gradle build。然后,解压缩生成的JAR文件(位于中build/libs):
├── META-INF
│ └── MANIFEST.MF
└── kuporific
├── A$B.class
├── A$C.class
└── A.class
打开每个文件(例如,在IntelliJ中),将显示编译器已完成的操作:
A.class:
package kuporific;
public class A {
public A() {
}
private class C {
public C() {
}
}
private static class B {
public B() {
}
}
}
A$B.class:
package kuporific;
class A$B {
private A$B() {
}
}
A$C.class:
package kuporific;
import kuporific.A;
class A$C {
private A$C(A this$0) {
this.this$0 = this$0;
}
}
注意
A$B没有引用其父项A,而引用A$C。这是因为前者是静态内部类,而后者不是,并且
这两个A$B和A$C现在 包专用 类。
这就是非静态内部类如何直接引用其父实例的字段和方法的方法,反之亦然。(在内部类中引用的父类的任何私有字段也都被设置为私有包。)
接下来,让我们看看加载类A对A$B和有什么影响A$C。
首先,添加以下Java类:
package kuporific;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Main.class.getClassLoader().loadClass("kuporific.A");
}
}
现在将以下内容添加到build.gradle文件中:
apply plugin: 'application'
mainClassName = 'kuporific.Main'
applicationDefaultJvmArgs = ["-verbose:class"]
该-verbose:class输出由JVM加载的所有类(见爪哇-
获取在JVM加载的所有类的列表)。
运行gradle run命令行(它运行上main的方法Main); 输出(加上我的注释)是
:compileJava
:processResources UP-TO-DATE
:classes
:run
[Opened /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]
[Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]
# Lots of omitted output...
[Loaded kuporific.Main from file:/tmp/build/classes/main/]
^ here!
[Loaded sun.launcher.LauncherHelper$FXHelper from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]
[Loaded java.lang.Class$MethodArray from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]
[Loaded kuporific.A from file:/tmp/build/classes/main/]
^ here!
[Loaded java.lang.Shutdown from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]
BUILD SUCCESSFUL
Total time: 6.502 secs
我们可以看到kuporific.Main和kuporific.A的加载时间,也看不到kuporific.A$B或kuporific.A$C正在加载。
2020-10-09