栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java ClassLoader是否加载内部类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java ClassLoader是否加载内部类?

一旦代码被编译, 就没有内部类之类的东西 。如果查看的结果

javac
,则会看到两个文件:

A.classA$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;        }    }

注意

  1. A$B
    没有引用其父项
    A
    ,而引用
    A$C
    。这是因为前者是静态内部类,而后者不是,并且
  2. 这两个
    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 SUCCESSFULTotal time: 6.502 secs

我们可以看到

kuporific.Main
kuporific.A
的加载时间,也看不到
kuporific.A$B
kuporific.A$C
正在加载。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453233.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号