如何以编程方式启用断言?
2022-09-01 07:00:11
如何以编程方式为特定类启用断言,而不是指定命令行参数“-ea”?
public class TestAssert {
private static final int foo[] = new int[]{4,5,67};
public static void main(String []args) {
assert foo.length == 10;
}
}
如何以编程方式为特定类启用断言,而不是指定命令行参数“-ea”?
public class TestAssert {
private static final int foo[] = new int[]{4,5,67};
public static void main(String []args) {
assert foo.length == 10;
}
}
尝试
ClassLoader loader = getClass().getClassLoader();
setDefaultAssertionStatus(true);
或
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
编辑:
基于注释
ClassLoader loader = ClassLoader.getSystemClassLoader();
loader.setDefaultAssertionStatus(true);
Class<?> c = loader.loadClass("MyClass");
MyClass myObj = (MyClass) c.newInstance();
public class MyClass {
private static final int foo[] = new int[]{4,5,67};
MyClass()
{
assert foo.length == 10;
}
}
这是对@bala很好答案的评论,但它太长了。
如果您只是启用断言,那么调用您的主类 - 您的主类将在启用断言之前加载,因此您可能需要一个不直接引用代码中任何其他内容的加载器。它可以设置断言,然后通过反射加载其余代码。
如果在加载类时未启用断言,则应立即“编译”它们,这样您就无法打开和关闭它们。如果你想切换它们,那么你根本不想要断言。
由于运行时编译,如下所示:
public myAssertNotNull(Object o) {
if(checkArguments)
if(o == null)
throw new IllegalArgumentException("Assertion Failed");
}
应该与断言一样快,因为如果代码执行了很多次,并且 checkArguments 是假的并且没有更改,那么整个方法调用可以在运行时编译出来,这将具有与断言相同的基本效果(此性能取决于 VM)。