Yansıtma yoluyla Java'da bir sınıfın public statik son alanı / özelliğinin değerini elde etme


103

Diyelim ki dersim var:

public class R {
    public static final int _1st = 0x334455;
}

"_1st" in değerini yansıtma yoluyla nasıl elde edebilirim ?


R._1stçalışamaz mıydı? Android geliştirmeden bahsediyorsanız, bence Rsınıf her zaman orada ...
Matthieu

@Matthieu Ben de öyle düşündüm, bu güne kadar aynı şeyi yapmak zorunda kaldım, ama sadece BRsınıfta.
Sevastyan Savanyuk

Yanıtlar:


132

Önce sınıfın alan özelliğini alın, ardından değeri alabilirsiniz. Türü biliyorsanız, get yöntemlerinden birini null ile kullanabilirsiniz (yalnızca statik alanlar için, aslında bir statik alanla get yöntemine iletilen bağımsız değişken tamamen yok sayılır). Aksi takdirde getType'ı kullanabilir ve aşağıdaki gibi uygun bir anahtar yazabilirsiniz:

Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
    System.out.println(f.getInt(null));
}else if(t == double.class){
    System.out.println(f.getDouble(null));
}...

Teşekkürler. Denedim ama işe yaramadı. F.getInt (null) işleminde istisna atılır. Yakaladım ama nasıl olur da bir istisna olur?
Viet

1
Ne tür bir istisna aldınız?
M.Jessup

Merhaba, Exception e.getMessage () "_1st" olan ve başka hiçbir şey olmayan alan adını döndürür.
Viet

1
Ancak istisnanın türü nedir? (yani, NullPointerException, SecurityException, ...)
M.Jessup

2
Belgeler getInt(), tartışmada geçirilenleri görmezden gelen asla bahsetmez nasıl olur ? Sınıfın örneğinin oradan geçmesini sağlamaya çalışmak için saatler harcadı.
Sevastyan Savanyuk

70
 R.class.getField("_1st").get(null);

İstisna işleme, okuyucu için bir alıştırma olarak bırakılmıştır.

Temelde, alanı herhangi bir diğer gibi yansıma yoluyla elde edersiniz, ancak get yöntemini çağırdığınızda, harekete geçecek bir örnek olmadığı için boş bir geçiş yaparsınız.

Bu, nihai olmalarına bakılmaksızın tüm statik alanlar için çalışır. Alan herkese açık değilse, setAccessible(true)önce onu aramanız gerekir ve elbette SecurityManager'ın tüm bunlara izin vermesi gerekir.


Anladım. İhtiyacım olan sınıf aslında R.id. Yardımınız için teşekkürler!
Viet

1

Ben de aynı rotayı takip ediyordum (oluşturulan R sınıfına bakıyordum) ve sonra bu korkunç hissi yaşadım, muhtemelen Kaynaklar sınıfında bir işlevdi. Haklıydım

Bu bulundu: Resources :: getIdentifier

İnsanlara biraz zaman kazandıracağını düşündüm. Dokümanlarda cesareti kırıldığını söylemelerine rağmen, bu çok şaşırtıcı değil.


Yani bunun bir Android sorusu olduğu sonucuna vardınız. Etiketlerde belirtilmiş olmalı ...
Matthieu

Bu bir Android sorusu değil, belirli bir örneği kullanan bir Java yansıtma sorusudur. Sorular konularına göre etiketlenir.
Matthew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.