2011-04-05 29 views
26

如何以编程方式为特定类启用断言,而不是指定命令行参数“-ea”?如何以编程方式启用断言?

public class TestAssert { 

    private static final int foo[] = new int[]{4,5,67}; 


    public static void main(String []args) { 
     assert foo.length == 10; 
    } 
} 

回答

8

这是@ bala很好的回答,但它太长了。

如果你只是启用断言然后调用主类 - 前启用断言,所以你可能会需要不直接引用其他任何东西在你的代码加载器主类将被载入。它可以设置断言,然后通过反射来加载代码的其余部分。

如果在类被加载,然后未启用断言,他们应该是“编出”立刻让你不会要能够启用和禁用它们。如果你想切换它们,那么你根本不需要断言。

由于运行时编译的,是这样的:因为如果代码被执行了很多,checkArguments是假的,然后不改变整个方法调用可以

public myAssertNotNull(Object o) { 
    if(checkArguments) 
     if(o == null) 
      throw new IllegalArgumentException("Assertion Failed"); 
} 

应工作几乎一样快,断言在运行时编译出来,这与断言具有相同的基本效果(此性能取决于VM)。

13

尝试

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; 
    } 
} 
+0

,你可以像“基于意见”的评论已被标记为已过时后不能正常工作,所以最好到正确记录的原因。为什么通过反射创建MyClass的实例? – 2017-04-26 11:42:12

2

最简单的&最好的方法可以是:

public static void assertion(boolean condition,String conditionFailureMessage) 
{ 
    if(!b) 
     throw new AssertionError(conditionFailureMessage); 
} 

无需设置电子艺界为VM参数。

通话的功能等:

assertion(sum>=n,"sum cannot be less than n"); 

如果断言失败,代码会给Asse田,否则代码将安全地运行。

+0

断言的要点是它们可以在JRE中被激活或不被激活,所以'assert x'语句有效或不可以。这是不可能的与您的建议。 – 2017-05-22 23:56:37

相关问题