心慌慌的小饼子 2023-12-27 11:00 采纳率: 100%
浏览 4
已结题

Java创建对象前不需要类加载了吗?

现在JDK是在哪个版本有改动吗?调用构造函数前不需要类加载了吗?为什么我用JDK21在创建对象时强制步入,不先进入ClassLoader类去调用loadClass()了😧

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-27 12:38
    关注

    【相关推荐】



    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/722908
    • 你也可以参考下这篇文章:Java的ClassLoader加载机制
    • 您还可以看一下 尚硅谷IT教育老师的Java基础核心编程课程中的 19_05了解类的加载器ClassLoader小节, 巩固相关知识点
    • 除此之外, 这篇博客: Java中的反射机制中的 三、类的加载与ClassLoader的理解 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      在这里插入图片描述
      在这里插入图片描述

      public class ClassLoadingTest {
      	public static void main(String[] args) {
      		System.out.println(A.m);
      	} 
      }
      class A {
      	static { 
      		m = 300;
      	}
      	static int m = 100;
      }
      //第二步:链接结束后m=0
      //第三步:初始化后,m的值由<clinit>()方法执行决定
      // 这个A的类构造器<clinit>()方法由类变量的赋值和静态代码块中的语句按照顺序合并产生,类似于
      // <clinit>(){
      // m = 300;
      // m = 100;
      // }
      

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      @Test
          public void test1(){
              //对于自定义类,使用系统类加载器进行加载
              ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
              System.out.println(classLoader);
              //调用系统类加载器的getParent():获取扩展类加载器
              ClassLoader classLoader1 = classLoader.getParent();
              System.out.println(classLoader1);
              //调用扩展类加载器的getParent():无法获取引导类加载器
              //引导类加载器主要负责加载java的核心类库,无法加载自定义类的。
              ClassLoader classLoader2 = classLoader1.getParent();
              System.out.println(classLoader2);
      
              ClassLoader classLoader3 = String.class.getClassLoader();
              System.out.println(classLoader3);
      
          }
      
       //1.获取一个系统类加载器
       ClassLoader classloader = ClassLoader.getSystemClassLoader();
       System.out.println(classloader);
       //2.获取系统类加载器的父类加载器,即扩展类加载器
       classloader = classloader.getParent();
       System.out.println(classloader);
       //3.获取扩展类加载器的父类加载器,即引导类加载器
       classloader = classloader.getParent();
       System.out.println(classloader);
       //4.测试当前类由哪个类加载器进行加载
       classloader = Class.forName("exer2.ClassloaderDemo").getClassLoader();
       System.out.println(classloader);
       //5.测试JDK提供的Object类由哪个类加载器加载
       classloader = 
       Class.forName("java.lang.Object").getClassLoader();
       System.out.println(classloader);
       //*6.关于类加载器的一个主要方法:getResourceAsStream(String str):获取类路径下的指定文件的输入流
       InputStream in = null;
       in = this.getClass().getClassLoader().getResourceAsStream("exer2\\test.properties");
       System.out.println(in);
      
      @Test
          public void test2() throws Exception {
      
              Properties pros =  new Properties();
              //此时的文件默认在当前的module下。
              //读取配置文件的方式一:
      //        FileInputStream fis = new FileInputStream("jdbc.properties");
      //        FileInputStream fis = new FileInputStream("src\\jdbc1.properties");
      //        pros.load(fis);
      
              //读取配置文件的方式二:使用ClassLoader
              //配置文件默认识别为:当前module的src下
              ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
              InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
              pros.load(is);
      
      
              String user = pros.getProperty("user");
              String password = pros.getProperty("password");
              System.out.println("user = " + user + ",password = " + password);
      
      
      
          }
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 已采纳回答 1月10日
  • 创建了问题 12月27日

悬赏问题

  • ¥15 python变量和列表之间的相互影响
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)