Bisakah kita menggunakan refleksi untuk mendapatkan anggota statis suatu kelas tanpa memanggil metode itu pada instance objek?

Bisakah kita menggunakan refleksi untuk mendapatkan anggota statis suatu kelas tanpa memanggil metode itu pada instance objek?

Dengan kata lain:

 public class MuchoStatic {

    private static staticMember;

    getStaticMember(){

    return this.staticMember;

    }
    } //end class

lalu ada kode lagi:

Method m = null;

try{

  m = MuchoStatic.class.getMethod("getStaticMember",null);

} catch (Exception e) {

}

Object o = null;
try{

 o = m.invoke(MuchoStatic.class,null);

} catch (Exception e) {

}

Saya mendapatkan pengecualian argumen ilegal, saya berasumsi itu karena saya meneruskan objek Kelas ke dalam metode pemanggilan. Ternyata Object o sebenarnya sudah dipakai, tapi pengecualian masih dilempar.

Bukankah kita seharusnya bisa melakukan ini?


person Alexander Mills    schedule 26.09.2013    source sumber


Jawaban (3)


Jika kita menggunakan

setAccessible(true);

dengan lapangan, bahkan tidak diperlukan metode dalam persamaan

Field f = MuchoStatic.class.getField("staticMember");
Object theStatic = f.get(null);

Tentu saja, ini tidak direkomendasikan... Mengotak-atik privasi bukanlah hal yang baik. Jangan mengutak-atik privasi orang lain!

Biola Ideone

person ppeterka    schedule 26.09.2013

Bisakah kita menggunakan refleksi untuk mendapatkan anggota statis suatu kelas tanpa memanggil metode itu pada instance objek?

Tentu saja karena bersifat statis.

Object o = null;
try {
    Method m = MuchoStatic.class.getMethod("getStaticMember");
    m.setAccessible(true);
    o = m.invoke(null);

} catch (Exception e) {
    // don't ignore the exception as it may be trying to tell you something
    throw new AssertionError(e);
}
person Peter Lawrey    schedule 26.09.2013
comment
Terima kasih, saya mencoba ini, tetapi saya mendapatkan NPE dari dalam metode pemanggilan. Apakah ada cara untuk langsung ke lapangan, tanpa harus memanggil pengambilnya? - person Alexander Mills; 27.09.2013
comment
@AlexMills Ya, Anda seharusnya membuat metode ini statis karena tidak memerlukan sebuah instance. - person Peter Lawrey; 27.09.2013

Anda tidak memerlukan instance untuk memanggil metode statis dan karena tidak memerlukan argumen apa pun, cukup

o = m.invoke(null);

Jika kelas Anda tidak berada dalam paket yang sama, Anda akan mengalami masalah, karena metode tersebut dinyatakan sebagai paket pribadi. Anda mungkin perlu menelepon

m.setAccessible(true);

sebelum invoke().

person Sotirios Delimanolis    schedule 26.09.2013