Vlákno názorů k článku Novinky v JDK 7 aneb mírný pokrok v mezích zákona – projekt Lambda od Vít Šesták (v6ak) - Ten dolar mě trošku překvapil - on bývá...

  • Článek je starý, nové názory již nelze přidávat.
  • 3. 12. 2010 10:33

    Vít Šesták (v6ak)

    Ten dolar mě trošku překvapil - on bývá běžně vnitřně používán na vnitřní a anonymní třídy. To znamená, že pokud odstraním příznak synthetic, tak mohu používat tyto třídy i pomocí dolaru? Třeba takto?:

    Foo.java:

    class Foo{
    
        private static Object x = new Comparator<String>(){...}
    
    }

    Bar.java:

    public class Bar{
    
        public static void main(String...args){
            System.out.println((new Foo$1().compare("a", "b"));
        }
    
    }
    1. $ javac Foo.java
    2. Odstranit příznak synthetic z Foo$1 (například ručně pomocí reJ nebo automatizovaně pomocí BCEL)
    3. $ javac Bar.java
    4. $ java Bar
  • 3. 12. 2010 11:52

    Pavel Tišnovský
    Zlatý podporovatel

    je to presne jak pisete. Podivejte se prosim na nasledujici zdrojak, samozrejme prelozitelny.

    (chybi typ u seznamu, ma tam byt samozrejme String, ale kvuli orezani HTML znacek jsem to radeji odtranil, tak me nebijte :-)

    import java.util.*;
    
    class Test$1
    {
    }
    
    class Test$2
    {
    }
    
    public class Test
    {
        public static void main(String[] args)
        {
            List list = new ArrayList(){
                {
                    add("hello");
                    add("world");
                }
            };
        }
    }

    Vysledkem prekladu budou ctyri soubory:

    1. Test.class - klasika ;-)
    2. Test$1.class - prvni non-public trida
    3. Test$2.class - druha non-public trida
    4. Test$3.class - synthetic trida vytvorena pro pridani prvku do seznamu

    jinymi slovy - prekladac si nejakou magii zjisti, jak anonymni tridy pojmenovat a prida do bajtkodu priznak synthetic.

  • 3. 12. 2010 11:54

    Pavel Tišnovský
    Zlatý podporovatel

    a pokud u Test$3.class vyhodite priznak synthetic, muzete IMHO (nezkousel jsem) volat jeji konstruktor, ktery vraci ArrayList naplneny dvema prvky "hello" a "world".