JavaRush /Java blogi /Random-UZ /Reflection API. GetModifiers() usuli Class sinfida qanday...
Георгий
Daraja
Санкт-Петербург

Reflection API. GetModifiers() usuli Class sinfida qanday ishlaydi

Guruhda nashr etilgan
public native int getModifiers()Sinfdagi usul Classva sinfdagi ba'zi doimiylar qanday bog'liq Modifier. Reflection API.  GetModifiers() usuli 1-sinfda qanday ishlaydiAytaylik, bizda sinf bor:
public static abstract class NestedClass{
}
Usul getModifiers()natijani sinf yoki u chaqirilgan usulning kirish modifikatorlari shifrlangan raqam sifatida qaytaradi. Sinfga qo'ng'iroq qilish uchun getModifiers(), masalan, uchun , siz sinf uchun NestedClasssinf ob'ektini yaratishingiz kerak . Va qo'ng'iroq qiling . ClassNestedClassClass<NestedClass>getModifiers()
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Yoki bitta satrda natijani va uning ikkilik ko'rinishini ko'rsating:
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
Yaxshi, lekin nima uchun bu raqam? Keling, sinf misolini ko'rib chiqaylik NestedClass. Aytaylik, bizda bir usul bor:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Uning parametrlariga quyidagilar kiradi: int allModifiers = NestedClass.class.getModifiers(), yuqoridagi misolda bo'lgani kabi. A int specificModifiersinf konstantalaridan biriga teng bo'ladi Modifier: Modifier.PUBLIC, Modifier.STATICva hokazo. (qolgan konstantalarni quyida ko'rib chiqamiz). trueAgar sinfda ga o'tkazilgan kirish o'zgartiruvchisi bo'lsa, usul bizga qaytadi specificModifier. Agar unday bo'lmasa - false. Sinov sinfidagi kod quyidagicha ko'rinadi:
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
Usul mantiqini qanday amalga oshirish kerak isModifierSet? Ikkilik tizimda sinfdagi modifikatorlarni ifodalaymiz Modifier: (masalan, Modifier.FINAL= 0x00000010, yoki 10-tizimda - 16. 16 ikkilik tizimda = 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
Va biz nimani ko'ramiz? Har bir modifikator uchun 10-da shunday raqam olinadiki, 2-da ularning 1-si bir o'ringa chapga siljiydi. Va getModifiers()shunday hisoblab chiqilganki, agar sinfda ma'lum bir kirish modifikatori bo'lsa, u holda kirish modifikatoridagi bir xil bit 1 ga teng bo'ladi. Quyidagi NestedClasskirish modifikatorlarida: public static abstract. Biri PUBLIC0 raqamiga teng (eng o'ngda). B STATIC- 3. B ABSTRACT- 10. Va endi biz o'zimiznikiga qaraymiz NestedClass.class.getModifiers(): 0, 3 va 10 raqamlarida u bitta raqamga ega! Qolganlari esa nolga teng. Keyinchalik muammoni hal qilishga o'tamiz. Bizning maxsus modifikatorimiz bor yoki yo'qligini tushunishimiz kerak getModifiers(). Keling, modifikator uchun vaziyatni ko'rib chiqaylik final. Modifier.FINAL= 16 = 0001 0000, shuning uchun bittasi 4-raqamga teng. Yuqoridagi misolga o'xshatib, bizniki NestedClass.class.getModifiers()= 100 0000 1001 ekanligini bilib olaylik Modifier.FINAL. Bu erda 4-raqam 0 ga teng. Bu unda mavjud emas degan ma'noni anglatadi, bu to'g'ri ( NestedClassemas final). Lekin usulda qanday mantiqni yozishim kerak? Biz mantiqiy qiymatni qo'llashimiz kerak AND (&), agar ikkala bit ham 1 bo'lsa, u 1 ga teng. Aks holda, 0. Bizning usulimiz nihoyat quyidagicha ko'rinadi:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
        return (allModifiers & specificModifier) > 0;
    }
Keling, kod ishlayotganiga ishonch hosil qilaylik va nima uchun ishlashini ko'rsatamiz. Biz hisoblaymiz NestedClass.class.getModifiers() & Modifier.FINAL:
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 000 0001 0000 - Modifier.FINAL(qulaylik uchun chapga 3 ta nol qo'shildi)
  • 000 0000 0000 - javob 0. Bizda bitta birlik yo'q, chunki faqat 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Bu shuni anglatadiki, bizning ifodamiz returnqaytib keladi false, chunki 0 > 0 - false. Bu shuni anglatadiki, bunday kirish modifikatori mavjud emas. Keling, qaraylik Modifier.ABSTRACT & NestedClass.class.getModifiers():
  • 100 000 0000 -Modifier.ABSTRACT
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - Eng chap birliklar mos keldi. 10-ga aylantiring: javob 1024.
Bu bizning ifodamiz returnqaytib kelishini anglatadi true, chunki 1024 > 0 - true. Shunday qilib, bunday kirish modifikatori mavjud. Reflection API.  getModifiers() usuli 2-sinfda qanday ishlaydiXuddi shu tarzda, bu usul ham sinf usullariga, ham sinf maydonlariga qo'llanilishi mumkin. Maydon uchun kod quyidagicha ko'rinadi:
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;
    }
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION