Reflexně přístup k statická proměnná ve třídě Java

hlasů
3

Dostal jsem žádnou jinou možnost než přístup sadu tříd, které nemohu měnit, s touto strukturou prostřednictvím reflexe. Při použití způsobu znázorněného na hlavní metodu níže však hodí NullPointerException. Nulová ukazatel bytost „stůl“ v konstruktoru při f1.get (null), se nazývá.

Jsem schopen vytvořit instanci třídy předem, protože jediným konstruktérem je jedna znázorněna, která je soukromý. Takže není žádný způsob, jak pro mě výslovně nastavit tabulku jeden.

Každý, kdo vědí o způsob, jak pro mě zamyšleně zavolat Legacy.A?

public class Legacy {   
    public static final Legacy A = new Legacy(A);
    public static final Legacy B = new Legacy(B);

    private String type0;
    private static Map<String, Legacy> table = new HashMap<String, Legacy>();

    private Legacy(String id) {
        type0 = id;
        table.put(type0, this);
    }

    public static void main(String[] args) throws Exception {
        Field f1 = Legacy.class.getDeclaredField(A);
        Object o = f1.get(null);    
    }
}

Před Reflection == BAD !!!

Položena 10/08/2009 v 21:22
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
7

Pořadí statických Inicializátory je špatné, tabulka musí přijít před konstruktor volání.

To je důvod, že dostanete výjimku, pokud je načten a inicializuje třídu. To nemá nic společného s odrazem.

Odpovězeno 10/08/2009 v 21:31
zdroj uživatelem

hlasů
4

Vzhledem k tomu, to je matoucí, tak bych napsat to takhle:

public class Legacy {   
        static {
          table = new HashMap<String, Legacy>();
          A = new Legacy("A");
          B = new Legacy("B");
        }

        public static final Legacy A;
        public static final Legacy B;

        private String type0;
        private static Map<String, Legacy> table;

        private Legacy(String id) {
                type0 = id;
                table.put(type0, this);
        }

    public static void main(String[] args) throws Exception {
                Field f1 = Legacy.class.getDeclaredField("A");
                Object o = f1.get(null);        
        }
}

Tímto způsobem, i když členové změnit polohu (v důsledku refaktorování, zarovnání linie nebo cokoliv) kód bude vždy fungovat.

Odpovězeno 10/08/2009 v 21:36
zdroj uživatelem

hlasů
0

Zkoušel jsem to, protože jsem nemohl vidět, co se svým příkladem špatného. Fungovalo to, jestli jsem přiobjednáno prohlášení:

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class Legacy {
    private String type0;
    private static Map< String, Legacy > table = new HashMap< String, Legacy >();

    private Legacy( String id ) {
        type0 = id;
        table.put( type0, this );
    }
    public static final Legacy A = new Legacy( "A" );
    public static final Legacy B = new Legacy( "B" );

    public static void main( String[] args ) throws Exception {
        Field f1 = Legacy.class.getDeclaredField( "A" );
        Object o = f1.get( null );
    }
}

Statické prohlášení potřebovat (před ní) konstruktor.

Odpovězeno 10/08/2009 v 21:35
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more