javac 7 is able to generate inner class that can't be verified
Remi Forax
forax at univ-mlv.fr
Thu Sep 20 04:44:41 PDT 2012
ping !
Rémi
On 07/05/2012 01:00 PM, Rémi Forax wrote:
> Hi Maurizio, hi all,
> there is a dubious code in javac that try to reuse existing inner
> class (or create one)
> when a constructor accessor need to be generated (see
> Lower.accessConstructorTag).
>
> Used in conjunction with the fact that the inner class exists but
> is created in a block guarded by 'if(false)' leads to a half baked
> generated class
> (no code for method run()) so the inner-class doesn't pass the
> verifier check.
>
> Code to reproduce:
> public class EmptyClassWithFakeConstructor {
> private static class Foo {
> // need to generate an accessor method
> }
>
> public static void main(String[] args) {
> new Foo(); // call the accessor
>
> if(false) {
> new Runnable() {
> @Override
> public void run() { // the code of this method is not generated
> System.out.println();
> }
> }.run();
> }
> }
> }
>
> javap -c EmptyClassWithFakeConstructor\$1.class
> Compiled from "EmptyClassWithFakeConstructor.java"
> final class EmptyClassWithFakeConstructor$1 implements
> java.lang.Runnable {
> EmptyClassWithFakeConstructor$1();
>
> public void run();
> }
>
> as you see, the method run is empty (but not abstract).
>
> cheers,
> Rémi
>
>
>
More information about the compiler-dev
mailing list