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解释一下,万分感谢

答案:

  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());
    }

img