Bagaimana metode
public native int getModifiers()
dari suatu kelas Class
dan beberapa konstanta dari suatu kelas saling berhubungan Modifier
. Katakanlah kita memiliki kelas:
public static abstract class NestedClass{
}
Metode ini getModifiers()
mengembalikan hasil berupa nomor yang pengubah akses kelas atau metode pemanggilannya dienkripsi. Untuk memanggil getModifiers()
suatu kelas, misalnya for NestedClass
, Anda perlu membuat objek kelas Class
untuk kelas tersebut NestedClass
. Dan Class<NestedClass>
telepon getModifiers()
.
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Atau dalam satu baris dan menampilkan hasil dan representasi binernya:
int classModifiers = NestedClass.class.getModifiers();
System.out.printf("classModifier = %d%n",classModifiers);
System.out.printf("classModifier в двоичной системе счисления = %s%n",Integer.toBinaryString(classModifiers));
Di layar:
classModifiers = 1033
classModifiers в двоичной системе счисления = 10000001001
Oke, tapi kenapa nomor khusus ini? Mari kita lihat contoh kelasnya NestedClass
. Katakanlah kita punya metode:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Parameternya akan mencakup: int allModifiers = NestedClass.class.getModifiers()
, seperti pada contoh di atas. A int specificModifier
akan sama dengan salah satu konstanta kelas Modifier
: Modifier.PUBLIC
, Modifier.STATIC
dst. (kami akan mempertimbangkan konstanta yang tersisa di bawah). Dan metode tersebut akan kembali kepada kita true
jika kelas tersebut berisi pengubah akses yang diteruskan ke specificModifier
. Jika tidak - false
. Kode di kelas tes akan terlihat seperti ini:
boolean isPublic = isModifierSet(classModifiers, Modifier.PUBLIC);
boolean isInterface = isModifierSet(classModifiers, Modifier.INTERFACE);
boolean isAbstract = isModifierSet(classModifiers, Modifier.ABSTRACT);
System.out.printf("\"Is NestedClass public?\" - %b%n", isPublic); //true
System.out.printf("\"Is NestedClass interface?\" - %b%n", isInterface); //false
System.out.printf("\"Is NestedClass abstract?\" - %b%n", isAbstract); //true
Bagaimana menerapkan logika metode ini isModifierSet
? Mari kita nyatakan pengubah di kelas dalam sistem biner Modifier
: (misalnya, Modifier.FINAL
= 0x00000010, atau dalam sistem ke-10 - 16. 16 dalam biner = 00010000)
Modifier.PUBLIC
= 1 = 0000 0001Modifier.PRIVATE
= 2 = 0000 0010Modifier.PROTECTED
= 4 = 0000 0100Modifier.STATIC
= 8 = 0000 1000Modifier.FINAL
= 16 = 0001 0000Modifier.SYNCHRONIZED
= 32 = 0010 0000Modifier.VOLATILE
= 64 = 0100 0000Modifier.TRANSIENT
= 128 = 1000 0000Modifier.NATIVE
= 256 = 1 0000 0000Modifier.INTERFACE
= 512 = 10 0000 0000Modifier.ABSTRACT
= 1024 = 100 0000 0000NestedClass.class.getModifiers()
= 1033 = 100 0000 1001
getModifiers()
dihitung sedemikian rupa sehingga jika suatu kelas berisi pengubah akses tertentu, maka bit yang sama seperti pada pengubah akses menjadi sama dengan 1. Dalam NestedClass
pengubah akses berikut: public
static
abstract
. Satu PUBLIC
sama dengan angka 0 (paling ke kanan). B STATIC
- 3. B ABSTRACT
- 10. Dan sekarang kita lihat punya kita NestedClass.class.getModifiers()
: Di angka 0, 3 dan 10 ada satu! Dan sisanya nol. Selanjutnya kita beralih ke pemecahan masalah. Kita perlu memahami apakah getModifiers()
pengubah spesifik kita mengandung. Mari kita pertimbangkan kasus pengubah final
. Modifier.FINAL
= 16 = 0001 0000, jadi satu sama dengan angka ke-4. Dengan analogi contoh di atas, mari kita lihat apakah milik kita NestedClass.class.getModifiers()
= 100 0000 1001 Modifier.FINAL
. Disini angka ke 4 sama dengan 0. Artinya tidak mengandung yang benar ( NestedClass
not final
). Tapi logika apa yang harus saya tulis dalam metode ini? Kita perlu menerapkan nilai logika AND (&)
, yaitu 1 jika kedua bitnya 1. Jika tidak, 0. Metode kita pada akhirnya akan terlihat seperti ini:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
return (allModifiers & specificModifier) > 0;
}
Mari kita pastikan kodenya berfungsi dan tunjukkan mengapa kode itu berhasil. Kami menghitung NestedClass.class.getModifiers() & Modifier.FINAL
:
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 000 0001 0000 -
Modifier.FINAL
(ditambahkan 3 angka nol di sebelah kiri untuk kenyamanan) - 000 0000 0000 - jawaban 0. Kami tidak memiliki satu unit pun, karena hanya 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
return
will return false
, karena 0 > 0 - false
. Ini berarti tidak ada pengubah akses seperti itu. Mari lihat Modifier.ABSTRACT & NestedClass.class.getModifiers()
:
- 100 0000 0000 -
Modifier.ABSTRACT
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 100 0000 0000 - Unit paling kiri cocok. Ubah ke tanggal 10: jawabannya adalah 1024.
return
will return true
, karena 1024 > 0 - true
. Jadi ada pengubah akses seperti itu. Dengan cara yang sama, metode ini dapat diterapkan pada metode kelas dan bidang kelas. Kode untuk field tersebut akan terlihat seperti ini:
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class A {
private static transient volatile String name = "Bob";
public static void main(String[] args) throws NoSuchFieldException {
Field field = A.class.getDeclaredField("name");
int fieldModifiers = field.getModifiers();
boolean isPublic = isModifierSet(fieldModifiers, Modifier.PUBLIC);
boolean isFinal = isModifierSet(fieldModifiers, Modifier.FINAL);
boolean isVolatile = isModifierSet(fieldModifiers, Modifier.VOLATILE);
System.out.printf("\"Is A.name public?\" - %b%n", isPublic); //false
System.out.printf("\"Is A.name final?\" - %b%n", isFinal); //false
System.out.printf("\"Is A.name volatile?\" - %b%n", isVolatile); //true
}
public static boolean isModifierSet(int allModifiers, int specificModifier) {
return (allModifiers & specificModifier) > 0;
}
}
GO TO FULL VERSION