首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JVM加载class文件的原理

当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载 】。...启动类加载器BootstrapLoader只能加载JAVA_HOME\jre\lib中的class类(即J2SE API),问题是标准API中确实有一个java.lang.String(注意,这个类和我们自定义的类是完全两个类...BootstrapLoader以为找到了这个类,毫不犹豫的加载了j2se api中的java.lang.String。...最后出现上面的加载错误(注意不是异常,是错误,JVM退出),因为API中的String类是没有main方法的。...结论:我们当然可以自定义一个和API完全一样的类,但是由于双亲委托模型,使得我们不可能加载上我们自定义的这样一个类。所以J2SE规范中希望我们自定义的包有自己唯一的特色(网络域名)。

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java面对对象(中.2)(多态性,终极父类,instanceof,包装类等)

    ,编译时e为Person类型,没有school成员变量,因而编 译错误。...= new Person(); e.getInfo(); Student e = new Student(); e.getInfo(); 虚拟方法调用(多态情况下) 子类中定义了与父类同名同参数的方法...and java.lang.String are in module java.base of loader 'bootstrap')     at ConversionTest.main(ConversionTest.java...(e.getschool()); //非法,编译时错误 if (e instanceof Student) { Student me = (Student) e; // 将e强制转换为Student类型...对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的 实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量  接下来我们说下,目前学习中我听过最中二的名字终极父类(Objext)

    42930

    Java 中文官方教程 2022 版(四十四)

    要理解的关键概念是,可变参数的方法被实现为如果可变参数被打包在一个数组中。 InvokeMain示例演示了如何调用任何类中的main()入口点,并在运行时传递一组参数。...在这种情况下,问题在于具有int参数的构造函数的存在阻止了编译器生成默认(或零参数)构造函数,并且代码中没有显式的零参数构造函数。...许多 Class 中的方法可以用于它们。反射为数组和枚举提供了一些特定的 API。本课程使用一系列代码示例来描述如何区分这些对象与其他类,并对其进行操作。还将检查各种错误。...Class.getEnumConstants() 可以检索在枚举中定义的枚举常量。java.lang.reflect.Field.isEnumConstant() 表示一个字段是否是一个枚举类型。...(EnumTrouble.java:22) 提示: 明确实例化枚举是一种编译时错误,因为这将阻止定义的枚举常量保持唯一。

    22900

    java基础之泛型

    通配符 通配符的扩展 自定义泛型方法 "擦除"实例 类型参数的类型推断 自定义泛型类 泛型方法和泛型类的比较 泛型和反射 通过反射获得泛型的实际类型参数 本文对泛型的基本知识进行较为全面的总结...super Integer > collection4= new ArrayList();//编译不通过 自定义泛型方法 C++模板函数 template T add...(T x, T y){ return (T)(x+y); } 而java的泛型基本上完全在编译器中实现,用于编译器执行类型检查和类型判断,然后生成普通的非泛型的字节码,这种实现技术为“擦除”(... void swap(T[]a,int i,int j){ T temp = a[i]; a[i] = a[j]; a[j] = temp;...例如: swap(new String[3],1,2) -> static void swap(E[]a,int i,int j) 当某个类型变量在整个参数列表的所有参数和返回值中的多处被应用了

    1.1K60

    夯实Java基础系列20:从IDE的实现原理聊起,谈谈那些年我们用过的Java命令

    •扩展类:Java\jdk1.7.0_25\jre\lib\ext目录中的文件,用-extdirs设置。•用户自定义类:用-classpath设置。...\bin] 如果利用 -bootclasspath 重新定义:javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包 java.lang...: 找不到或无法加载主类 h.jar 这个错误是没有指定main类,所以类似这样来指定: E:\codeplace\n_learn\java\javacmd\build>java -cp h.jar com.yp.test.HelloWorld...先下一个jar包 这里直接下 log4j * main函数改成 import com.yp.test.entity.Cat; import org.apache.log4j.Logger; public...15:19:57,359 INFO [HelloWorld] 这是log4j hello,keyboard 说明: 这个log4j配置文件,习惯的做法是放在src目录下, 在编译过程中 copy到build

    94610

    夯实Java基础系列20:从IDE的实现原理聊起,谈谈那些年我们用过的Java命令

    •扩展类:Java\jdk1.7.0_25\jre\lib\ext目录中的文件,用-extdirs设置。 •用户自定义类:用-classpath设置。...\bin] 如果利用 -bootclasspath 重新定义: javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包...: 找不到或无法加载主类 h.jar 这个错误是没有指定main类,所以类似这样来指定: E:\codeplace\n_learn\java\javacmd\build>java -cp h.jar com.yp.test.HelloWorld...先下一个jar包 这里直接下 log4j * main函数改成 import com.yp.test.entity.Cat; import org.apache.log4j.Logger; public...15:19:57,359 INFO [HelloWorld] 这是log4j hello,keyboard 说明: 这个log4j配置文件,习惯的做法是放在src目录下, 在编译过程中 copy到

    1.6K20

    【Java基本功】离开IDE,使用javac和Java构建项目

    •扩展类:Java\jdk1.7.025\jre\lib\ext目录中的文件,用-extdirs设置。 •用户自定义类:用-classpath设置。...\bin] 如果利用 -bootclasspath 重新定义: javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包 java.lang...: 找不到或无法加载主类 h.jar 这个错误是没有指定main类,所以类似这样来指定: E:\codeplace\n_learn\java\javacmd\build>java -cp h.jar com.yp.test.HelloWorld...先下一个jar包 这里直接下 log4j * main函数改成 import com.yp.test.entity.Cat; import org.apache.log4j.Logger; public...15:19:57,359 INFO [HelloWorld] 这是log4j hello,keyboard 说明: 这个log4j配置文件,习惯的做法是放在src目录下, 在编译过程中 copy到build

    1.8K20

    学会 arthas,让你 3 年经验掌握 5 年功力!

    注意这个命令需要调用后才会触发日志,相似的还有watch、trace等 2、jad 反编译指定已加载类的源码 有时候,版本发布后,代码竟然没有执行,代码是最新的吗,这时可以使用jad反编译相应的class...java.lang.String ([BII)V java.lang.String ([BLjava/nio/charset/Charset;)V java.lang.String...查看String中toString的详细信息 sm -d java.lang.String toString declaring-class  java.lang.String  method-name...jdk中的方法,可以看到输出少了很多 trace -j cn.test.mobile.controller.order.OrderController getOrderInfo '#cost > 10'...反编译OrderController,默认情况下,反编译结果里会带有ClassLoader信息,通过--source-only选项,可以只打印源代码。

    46340

    Java 8 Lambda 的实现原理及源码剖析

    为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢?...main(java.lang.String[]); private static void lambda$0(java.lang.String); } 由上面的代码可以看出编译器会根据 Lambda...我们在代码中定义一个 lambda$0 这个的函数,最终代码如下所示: @FunctionalInterface interface Print { public void print(T...,因为存在两个 lambda$0 函数,如下所示,是运行时的错误: Exception in thread "main" java.lang.ClassFormatError: Duplicate method...ClassLoader.java:357) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495) 通过 javap 对上述错误代码进行反编译

    1.8K53

    Java基础14:离开IDE,使用java和javac构建项目

    •扩展类:Java\jdk1.7.0_25\jre\lib\ext目录中的文件,用-extdirs设置。 •用户自定义类:用-classpath设置。...\bin] 如果利用 -bootclasspath 重新定义: javac -bootclasspath src Xxx.java,则会出现下面错误: 致命错误: 在类路径或引导类路径中找不到程序包...: 找不到或无法加载主类 h.jar 这个错误是没有指定main类,所以类似这样来指定: E:\codeplace\n_learn\java\javacmd\build>java -cp h.jar com.yp.test.HelloWorld...先下一个jar包 这里直接下 log4j * main函数改成 import com.yp.test.entity.Cat; import org.apache.log4j.Logger; public...15:19:57,359 INFO [HelloWorld] 这是log4j hello,keyboard 说明: 这个log4j配置文件,习惯的做法是放在src目录下, 在编译过程中 copy到build

    1.6K00

    【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    [] | 完整分析字节码文件中的常量池二进制数据 ) ; 一、编译生成带局部变量表的字节码文件 ---- 在 IntelliJ IDEA 中编写如下两个源码 : Java 类源码 : 在 setName...= 1; int k = 2; } } 在 main 函数中 创建上述 Student 类对象 : 一定要写这个 main 函数 , 否则虚拟机编译优化时 , 发现 setName...中的局部变量没有使用 , 直接优化掉 , 不生成相关的 局部变量表 ; public class Main { public static void main(String[] args) {..., 定义了 3 个局部变量 , 将 setName 方法的对应字节码的附加信息提取出来单独分析 , 该方法对应的字节码数据中 , 肯定有局部变量表 ; public void setName(java.lang.String...在 编译时 , 就已经在字节码文件中 生成好了 , 在 类加载器 将字节码文件加载到内存中时 , 直接将 字节码中的数据加载到 LocalVariableTable: Start

    29020

    java学习--反射详解

    ,比如自己定义只定义一个有参数的构造函数之后,会出现错误: 比如我定义了一个构造函数: public Person(String name, int age) { this.age...(hello.java:47) 所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数 【案例4】通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class...final java.lang.String name; public static final int age; 【案例9】其实还可以通过反射调用其他类中的方法: class hello...同时也是java中默认的加载器。 如果想要完成动态代理,首先需要定义一个InvocationHandler接口的子类,已完成代理的具体操作。...sub.say("Rollen", 20); System.out.println(info); } } 【运行结果】: Rollen 20 类的生命周期 在一个类编译完成之后

    45710

    面试官问:可以自定义String类吗?麻了~

    ; } } 没有什么,就单纯的定义一个java.lang.String 类。 会报错吗?可以说会,也可以说不会。 先说为什么不会报错。 从语法的角度以及编译,都不会报错。 为什么会报错?...错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX...应用程序类必须扩展javafx.application.Application 错误信息里面提到在类 java.lang.String 中找不到 main 方法,这不是有毛病吧,我这String类里明细有...,所以,就优先加载了rt.jar包中String类了,这个类里确实也没有main方法,所以就报错了呗。...到此,我们就搞清楚了为什么没有main的错误信息的原因了。

    16810
    领券