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

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 求购HI3519AV100开发板
  • ¥15 请问1553 RT怎么测试,没有BC有方法吗
  • ¥100 业务编程如何选择学习方向和内容?
  • ¥15 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 【有偿】调用DXGI截图初始化失败,提示0xf 887a0004
  • ¥15 请问如何查看手机root记录?
  • ¥15 商城小程序订单号重复
  • ¥15 学校优化算法sbo和蚁群算法怎么结合