JavaRush /Java Blog /Random-ID /API Refleksi. Bagaimana metode getModifiers() bekerja di ...
Георгий
Level 22
Санкт-Петербург

API Refleksi. Bagaimana metode getModifiers() bekerja di kelas Class

Dipublikasikan di grup Random-ID
Bagaimana metode public native int getModifiers()dari suatu kelas Classdan beberapa konstanta dari suatu kelas saling berhubungan Modifier. API Refleksi.  Cara kerja metode getModifiers() di Kelas - 1Katakanlah 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 Classuntuk 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 specificModifierakan sama dengan salah satu konstanta kelas Modifier: Modifier.PUBLIC, Modifier.STATICdst. (kami akan mempertimbangkan konstanta yang tersisa di bawah). Dan metode tersebut akan kembali kepada kita truejika 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 0001
  • Modifier.PRIVATE= 2 = 0000 0010
  • Modifier.PROTECTED= 4 = 0000 0100
  • Modifier.STATIC= 8 = 0000 1000
  • Modifier.FINAL= 16 = 0001 0000
  • Modifier.SYNCHRONIZED= 32 = 0010 0000
  • Modifier.VOLATILE= 64 = 0100 0000
  • Modifier.TRANSIENT= 128 = 1000 0000
  • Modifier.NATIVE= 256 = 1 0000 0000
  • Modifier.INTERFACE= 512 = 10 0000 0000
  • Modifier.ABSTRACT = 1024 = 100 0000 0000
  • NestedClass.class.getModifiers()= 1033 = 100 0000 1001
Dan apa yang kita lihat? Untuk setiap pengubah, angka pada angka 10 diambil sedemikian rupa sehingga pada angka 2, 1 berpindah satu tempat ke kiri. Dan 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 NestedClasspengubah akses berikut: public static abstract. Satu PUBLICsama 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 ( NestedClassnot 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;
Artinya ekspresi kita di returnwill 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.
Artinya ekspresi kita di returnwill return true, karena 1024 > 0 - true. Jadi ada pengubah akses seperti itu. API Refleksi.  Cara kerja metode getModifiers() di Kelas - 2Dengan 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;
    }
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION