benf.org : other : cfr : How is 'assert' implemented? |
Again, nothing secret here - the documentation for desired assertion status is here, and there is a proposal for assertions here.
And there's a sun/oracle tutorial here.
Assertions were introduced in java 1.4. As with many things in Java, they're implemented as changes to the language and syntactic sugar rather than underlying JVM changes
C programmers might expect asserting code not to get compiled at all, but that's because C has differing release and debug versions - that's a runtime decision for java - the oracle tutorial page has a good section on design considerations.
public class AssertTest { public void test1(String s) { assert (!s.equals("Fred")); System.out.println(s); } }
public class AssertTest { static final /* synthetic */ boolean $assertionsDisabled; public void test1(String s) { if ((!(AssertTest.$assertionsDisabled)) && (s.equals("Fred"))) { throw new AssertionError(); } System.out.println(s); } static { AssertTest.$assertionsDisabled = !(AssertTest.class.desiredAssertionStatus()); } }
You can see that 'is an enum on for this class' is a static, which is initialised in the static initialiser block, and 'assert' gets compiled down to if statements which check this condition.
One thing that's interesting - the original proposal called for $assertionsEnabled, but we have ended up with $assertionsDisabled. I have no idea why!
public class AssertTest { public void test1(String s) { assert (!(s.equals("Fred"))); System.out.println(s); } }
Last updated 02/2013 |