2011-04-05 8 views

답변

8

이것은 @ bala의 좋은 대답에 대한 의견 이었지만 너무 오래되었습니다.

어설 션을 활성화 한 다음 기본 클래스를 호출하면 어설 션이 활성화되기 전에 기본 클래스가로드되므로 코드의 다른 요소를 직접 참조하지 않는 로더가 필요할 수 있습니다. 어서션을 설정 한 다음 리플렉션을 통해 나머지 코드를로드 할 수 있습니다.

클래스가로드 될 때 어설 션을 사용할 수없는 경우에는 즉시 "컴파일 아웃"해야 켜기/끄기를 전환 할 수 없습니다. 그 (것)들을 토글하는 경우에 당신은 단언을 전혀 원하지 않는다. 코드가 많이 실행되고 checkArguments가 false 다음 전체 메서드 호출이 수 변경되지 않기 때문에 경우

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의 인스턴스를 만드는 이유는 무엇입니까? –

2

간단한 & 가장 좋은 방법이 될 수 있습니다

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

VM 인수로 -ea 설정할 필요합니다. 같은 기능이

전화 :

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

주장이 실패 할 경우, 코드가 AssertionError를 줄 것이다는 다른 코드를 안전하게 실행됩니다.

+0

어설 션점은 JRE에서 활성화되거나 활성화 될 수 없으므로 "assert x"문이 효과가 있는지 여부입니다. 이것은 당신의 제안으로는 불가능합니다. –

관련 문제