java 内部类 加载_Java ClassLoader是否加载内部类?

小编典典

一旦代码被编译, 就没有内部类之类的东西 。如果查看的结果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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值