cantable 2022-07-25 10:02 采纳率: 100%
浏览 64
已结题

java对类加载器设置断言不生效

跟着核心卷学习看到可以从类加载器中开启和关闭断言,自己试一下,结果出现了设置断言不生效的情况
//此时开启了虚拟机的断言:idea的vm option输入-ea
public class MainTest {
public static void main(String[] args) throws Exception{
String name="com.seTest.asertTest.Demo";
// 该类是自定义的,该类加载器属于系统类加载器,这里直接获取到最顶层的systemClassLoader,双亲委派时会优先使用该加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
classLoader.setDefaultAssertionStatus(false);
Class<?> aClass = classLoader.loadClass(name);
System.out.println(aClass.newInstance().toString());

    classLoader.setDefaultAssertionStatus(true);
    aClass = classLoader.loadClass(name);
    System.out.println(aClass.newInstance().toString());
}

}
public class Demo {
@Override
public String toString() {
assert false;
return "测试成功";
}
}
我觉得它在第二次调用demo的toString时应该断言出错,但实际上没有断言,成功打印。
如果我更换开启和关闭的顺序,那么第一次调用demo时就会成功断言,所以我的一个不成熟的猜想是:一个类在第一次加载完毕后应该会被存起来,下次再加载时就不会在用类加载器去加载了,所以第二次在加载该类时类加载器的设置就不生效了

希望有dl解释一下,万分感谢

  • 写回答

2条回答 默认 最新

  • kse_music 2022-07-29 17:46
    关注

    答案:

    1. 两次都成功了,是因为同一个class,classloader只加载一次
    2. 把setDefaultAssertionStatus(true)放前面,这样两次都出错,可以catch异常看效果
        public static void main(String[] args) throws Exception {
            String name="com.seTest.asertTest.Demo";
            ClassLoader classLoader=ClassLoader.getSystemClassLoader();
            classLoader.setDefaultAssertionStatus(true);
            Class aClass = classLoader.loadClass(name);
            try{
                System.out.println(aClass.newInstance());
            }catch (Throwable e){
                e.printStackTrace();
            }
            classLoader.setDefaultAssertionStatus(false);
            aClass = classLoader.loadClass(name);
            System.out.println(aClass.newInstance());
        }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月10日
  • 已采纳回答 8月2日
  • 赞助了问题酬金5元 7月27日
  • 创建了问题 7月25日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加