JavaRush /Blog Jawa /Random-JV /Refleksi API. Cara getModifiers () dianggo ing kelas Kela...
Георгий
tingkat
Санкт-Петербург

Refleksi API. Cara getModifiers () dianggo ing kelas Kelas

Diterbitake ing grup
Kepiye cara public native int getModifiers()saka kelas Classlan sawetara konstanta saka kelas sing ana gandhengane Modifier. Refleksi API.  Kepiye cara getModifiers () dianggo ing Kelas - 1Ayo kita duwe kelas:
public static abstract class NestedClass{
}
Cara kasebut getModifiers()ngasilake asil minangka nomer ing ngendi modifiers akses saka kelas utawa cara sing diarani dienkripsi. Kanggo nelpon ing getModifiers()kelas, contone kanggo NestedClass, sampeyan kudu nggawe obyek kelas Classkanggo kelas NestedClass. Lan Class<NestedClass>nelpon getModifiers().
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Utawa ing siji baris lan nampilake asil lan perwakilan binar:
int classModifiers = NestedClass.class.getModifiers();
System.out.printf("classModifier = %d%n",classModifiers);
System.out.printf("classModifier в двоичной системе счисления = %s%n",Integer.toBinaryString(classModifiers));
Ing layar:

classModifiers = 1033
classModifiers в двоичной системе счисления = 10000001001
Oke, nanging kenapa nomer tartamtu iki? Ayo deleng conto kelas kasebut NestedClass. Ayo kita duwe metode:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Paramèter kasebut bakal kalebu: int allModifiers = NestedClass.class.getModifiers(), kaya ing conto ing ndhuwur. A int specificModifierbakal padha karo salah siji saka konstanta kelas Modifier: Modifier.PUBLIC, Modifier.STATICetc. (kita bakal nimbang tetep tetep ing ngisor iki). Lan cara bakal bali kanggo kita trueyen kelas ngemot modifier akses liwati menyang specificModifier. Yen ora - false. Kode ing kelas test bakal katon kaya iki:
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
Kepiye cara ngetrapake logika metode kasebut isModifierSet? Ayo makili modifiers ing kelas ing sistem binar Modifier: (contone, Modifier.FINAL= 0x00000010, utawa ing sistem kaping 10 - 16. 16 ing binar = 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
Lan apa sing kita deleng? Kanggo saben modifier, nomer ing 10 dijupuk supaya ing 2nd, 1 gerakane sak panggonan ngiwa. Lan getModifiers()wis diwilang ing kuwi cara yen kelas ngemot modifier akses tartamtu, banjur dicokot padha ing modifier akses dadi padha karo 1. Ing NestedClassmodifiers akses ing ngisor iki public static abstract:. Siji PUBLICpadha karo 0 digit (paling adoh ing sisih tengen). B STATIC- 3. B ABSTRACT- 10. Lan saiki kita katon ing kita NestedClass.class.getModifiers(): Ing 0, 3 lan 10 digit wis siji! Lan kabeh liyane nol. Sabanjure kita nerusake kanggo ngrampungake masalah. Kita kudu ngerti apa getModifiers()modifier spesifik kita ngemot. Ayo nimbang kasus kanggo modifier final. Modifier.FINAL= 16 = 0001 0000, dadi siji padha karo digit kaping 4. Miturut analogi karo conto ing ndhuwur, ayo padha ndeleng yen kita NestedClass.class.getModifiers()= 100 0000 1001 Modifier.FINAL. Ing kene angka 4 padha karo 0. Iki tegese ora ngemot, sing bener ( NestedClassora final). Nanging apa logika aku kudu nulis ing cara? Kita kudu ngetrapake nilai logis AND (&), yaiku 1 yen loro bit 1. Yen ora, 0. Cara kita pungkasane bakal katon kaya iki:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
        return (allModifiers & specificModifier) > 0;
    }
Ayo priksa manawa kode kasebut bisa digunakake lan nuduhake apa sebabe. Kita ngitung NestedClass.class.getModifiers() & Modifier.FINAL:
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 000 0001 0000 - Modifier.FINAL(ditambahake 3 nul ing sisih kiwa kanggo penak)
  • 000 0000 0000 - jawaban 0. Kita ora duwe unit siji, amarga mung 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Iki tegese ekspresi kita returnbakal bali false, amarga 0 > 0 - false. Iki tegese ora ana modifier akses kasebut. Ayo katon Modifier.ABSTRACT & NestedClass.class.getModifiers():
  • 100 0000 0000 -Modifier.ABSTRACT
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - Unit paling kiwa cocog. Ngonversi menyang 10: jawabane 1024.
Iki tegese ekspresi kita returnbakal bali true, amarga 1024 > 0 - true. Dadi ana modifier akses kasebut. Refleksi API.  Carane metode getModifiers () dianggo ing Kelas - 2Kanthi cara sing padha, metode iki bisa ditrapake kanggo metode kelas lan lapangan kelas. Kode kanggo lapangan bakal katon kaya iki:
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