JavaRush /Java Blog /Random-TK /Oýlanma API. GetModifiers () usuly synp synpynda nähili i...
Георгий
Dereje
Санкт-Петербург

Oýlanma API. GetModifiers () usuly synp synpynda nähili işleýär

Toparda çap edildi
public native int getModifiers()Bir synpdan usul Classwe synpdan käbir yzygiderlilik nähili baglanyşykly Modifier. Oýlanma API.  GetModifiers () usulynyň 1-nji synpda nähili işleýändigiSynpymyz bar diýeliň:
public static abstract class NestedClass{
}
Usul, netijäni getModifiers()synpyň giriş üýtgeýjileriniň ýa-da atlandyrylan usuly şifrlenen san hökmünde gaýtaryp berýär. getModifiers()Mysal üçin, bir klasa jaň etmek üçin synp üçin NestedClasssynp obýektini döretmeli . Jaň ediň . ClassNestedClassClass<NestedClass>getModifiers()
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Ora-da bir setirde netijäni we ikilik şekillendirişini görkeziň:
int classModifiers = NestedClass.class.getModifiers();
System.out.printf("classModifier = %d%n",classModifiers);
System.out.printf("classModifier в двоичной системе счисления = %s%n",Integer.toBinaryString(classModifiers));
Ekranda:

classModifiers = 1033
classModifiers в двоичной системе счисления = 10000001001
Bolýar, ýöne näme üçin bu aýratyn san? Synpyň mysalyna seredeliň NestedClass. Usulymyz bar diýeliň:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Onuň parametrleri aşakdakylary öz içine alar: int allModifiers = NestedClass.class.getModifiers()ýokardaky mysaldaky ýaly. A int specificModifiersynp yzygiderliliginiň birine deň bolar Modifier: Modifier.PUBLICwe Modifier.STATICş.m. (aşakda galan yzygiderliligi göz öňünde tutarys). trueEger synpda giriş ygtyýar üýtgedijisi bar bolsa, usul bize gaýdyp geler specificModifier. Däl bolsa - false. Synag synpyndaky kod şeýle bolar:
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
Usulyň logikasyny nädip durmuşa geçirmeli isModifierSet? Ikilik ulgamynda synpdaky üýtgeýjileri görkezeliň Modifier: (mysal üçin, Modifier.FINAL= 0x00000010, ýa-da 10-njy ulgamda - 16. 16 ikilik = 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
Biz näme görýäris? Her üýtgediji üçin 10-da bir san şeýle alynýar welin, 2-nji ýerde 1-i bir ýeri çepe geçirýär. Şeýlelik getModifiers()bilen hasaplanýar, eger bir synpda belli bir giriş üýtgeýjisi bar bolsa, giriş modifikatoryndaky ýaly bir zat 1-e deň bolar. NestedClassAşakdaky giriş üýtgeýjilerinde : public static abstract. Biri PUBLIC0 belgä deňdir (sagdan iň uzakda). B STATIC- 3. B ABSTRACT- 10. Indi bolsa özümize seredýäris NestedClass.class.getModifiers(): 0, 3 we 10 sanlarda bir bar! Galanlaryň hemmesi nola deň. Soň bolsa meseläni çözmäge geçeris. Specificörite üýtgedijimiziň bardygyny ýa-da ýokdugyna düşünmelidiris getModifiers(). Üýtgediji üçin meselä seredeliň final. Modifier.FINAL= 16 = 0001 0000, şonuň üçin biri 4-nji belgä deňdir. Aboveokardaky mysal bilen meňzeşlik bilen, geliň, özümiziň NestedClass.class.getModifiers()= 100 0000 1001 ýa-da däldigini göreliň Modifier.FINAL. Bu ýerde 4-nji san 0-a deňdir. Diýmek, ol öz içine almaýar, bu dogry ( NestedClassýok final). Methodöne usulda haýsy logika ýazmaly? Logiki bahany ulanmalydyrys AND (&), eger iki bit bolsa 1 bolýar. Otherwiseogsam, 0. Usulymyz ahyrsoňy şeýle bolar:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
        return (allModifiers & specificModifier) > 0;
    }
Kodyň işleýändigine göz ýetiriň we näme üçin işleýändigini görkezeliň. Hasaplaýarys NestedClass.class.getModifiers() & Modifier.FINAL:
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 000 0001 0000 - Modifier.FINAL(amatlylyk üçin çepe 3 nol goşuldy)
  • 000 0000 0000 - jogap 0. Bizde ýekeje bölüm ýok, sebäbi diňe 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Bu, biziň aňlatmamyzyň returngaýdyp geljekdigini aňladýar false, sebäbi 0> 0 - false. Diýmek, beýle giriş üýtgediji ýok. Geliň seredeliň Modifier.ABSTRACT & NestedClass.class.getModifiers():
  • 100 0000 0000 -Modifier.ABSTRACT
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - Iň çep bölümler gabat geldi. 10-a öwüriň: jogap 1024.
Bu, biziň aňlatmamyzyň returngaýdyp geljekdigini aňladýar true, sebäbi 1024> 0 - true. Şonuň üçin şeýle giriş üýtgediji bar. Oýlanma API.  GetModifiers () usuly 2-nji synpda nähili işleýärEdil şonuň ýaly, bu usul synp usullaryna-da, synp meýdanlaryna-da ulanylyp bilner. Meýdanyň kody şeýle bolar:
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;
    }
}
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION