JavaRush /Блоги Java /Random-TG /API Reflection. Чӣ тавр усули getModifiers() дар синфи Си...
Георгий
Сатҳи
Санкт-Петербург

API Reflection. Чӣ тавр усули getModifiers() дар синфи Синф кор мекунад

Дар гурӯҳ нашр шудааст
Чӣ гуна усул public native int getModifiers()аз синф Classва баъзе доимӣ аз синф алоқаманданд Modifier. API Reflection.  Чӣ тавр усули getModifiers() дар Синф - 1 кор мекунадФарз мекунем, ки мо синф дорем:
public static abstract class NestedClass{
}
Усул getModifiers()натиҷаро ҳамчун адад бармегардонад, ки дар он тағирдиҳандаҳои дастрасии синф ё усуле, ки аз он даъват карда мешавад, рамзгузорӣ карда мешаванд. Барои занг задан ба getModifiers()синф, масалан барои NestedClass, шумо бояд an objectи синфро Classбарои синф эҷод кунед NestedClass. Ва Class<NestedClass>занг занед getModifiers().
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Ё дар як сатр ва натиҷа ва намояндагии дуии онро намоиш диҳед:
int classModifiers = NestedClass.class.getModifiers();
System.out.printf("classModifier = %d%n",classModifiers);
System.out.printf("classModifier в двоичной системе счисления = %s%n",Integer.toBinaryString(classModifiers));
Дар экран:

classModifiers = 1033
classModifiers в двоичной системе счисления = 10000001001
Хуб, аммо чаро ин рақами мушаххас? Биёед мисоли синфро бубинем NestedClass. Фарз мекунем, ки мо як усул дорем:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Параметрҳои он иборатанд аз: int allModifiers = NestedClass.class.getModifiers(), чунон ки дар мисоли боло. A int specificModifierба яке аз константаҳои синфӣ баробар мешавад Modifier: Modifier.PUBLIC, Modifier.STATICва ғайра. (мо константаҳои боқимондаро дар зер баррасӣ хоҳем кард). Ва усул ба мо бармегардад, trueагар синф тағирдиҳандаи дастрасиро, ки ба specificModifier. Агар не - false. Рамз дар синфи санҷиш чунин хоҳад буд:
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
Мантиқи усулро чӣ гуна бояд амалӣ кард isModifierSet? Биёед тағирдиҳандаҳоро дар синф дар системаи дуӣ муаррифӣ кунем Modifier: (масалан, Modifier.FINAL= 0x00000010, ё дар системаи 10 - 16. 16 дар бинарӣ = 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 000 0000
  • Modifier.ABSTRACT = 1024 = 100 000 0000
  • NestedClass.class.getModifiers()= 1033 = 100 0000 1001
Ва мо чиро мебинем? Барои ҳар як тағирдиҳанда рақами 10-ум гирифта мешавад, ки дар 2-юм 1-и онҳо як ҷой ба тарафи чап ҳаракат мекунад. Ва getModifiers()он тавре ҳисоб карда мешавад, ки агар дар синф як тағирдиҳандаи дастрасии муайян дошта бошад, ҳамон бит, ки дар тағирдиҳандаи дастрасӣ ба 1 баробар мешавад. Дар NestedClassтағирдиҳандаҳои дастрасии зерин: public static abstract. Яке PUBLICба рақами 0 баробар аст (аз дуртарин ба рост). B STATIC- 3. B ABSTRACT- 10. Ва ҳоло мо ба рақами худ менигарем NestedClass.class.getModifiers(): Дар рақамҳои 0, 3 ва 10 як рақам дорад! Ва ҳамаи боқимондаҳо сифр мебошанд. Минбаъд мо ба ҳалли мушкилот мегузарем. Мо бояд фаҳмем, ки оё getModifiers()тағирдиҳандаи мушаххаси мо дар бар мегирад. Биёед парвандаи тағирдиҳандаро баррасӣ кунем final. Modifier.FINAL= 16 = 0001 0000, пас як ба рақами 4-ум баробар аст. Дар муқоиса бо мисоли дар боло овардашуда, биёед бубинем, ки оё мо NestedClass.class.getModifiers()= 100 0000 1001 аст Modifier.FINAL. Дар ин ҷо рақами 4-ум ба 0 баробар аст. Ин маънои онро надорад, ки он дар бар намегирад, ин дуруст аст ( NestedClassне final). Аммо дар усул чӣ мантиқ бояд нависам? Мо бояд арзиши мантиқиро татбиқ кунем AND (&), ки он 1 аст, агар ҳарду бит 1 бошанд. Дар акси ҳол, 0. Усули мо ниҳоят чунин хоҳад буд:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
        return (allModifiers & specificModifier) > 0;
    }
Биёед боварӣ ҳосил кунем, ки code кор мекунад ва нишон медиҳад, ки чаро он кор мекунад. Мо ҳисоб мекунем NestedClass.class.getModifiers() & Modifier.FINAL:
  • 100 000 1001 -NestedClass.class.getModifiers()
  • 000 0001 0000 - Modifier.FINAL(барои роҳат ба тарафи чап 3 сифр илова карда шуд)
  • 000 0000 0000 - ҷавоб 0. Мо як воҳиди ягона надорем, зеро танҳо 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Ин маънои онро дорад, ки ифодаи мо дар returnбармегардад false, зеро 0 > 0 - false. Ин маънои онро дорад, ки чунин тағирдиҳандаи дастрасӣ вуҷуд надорад. Биёед бубинем Modifier.ABSTRACT & NestedClass.class.getModifiers():
  • 100 000 0000 -Modifier.ABSTRACT
  • 100 000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - Воҳидҳои чаптарин мувофиқат карданд. Ба 10-ум табдил диҳед: ҷавоб 1024 аст.
Ин маънои онро дорад, ки ифодаи мо дар returnбармегардад true, зеро 1024 > 0 - true. Ҳамин тавр, чунин тағирдиҳандаи дастрасӣ вуҷуд дорад. API Reflection.  Чӣ тавр усули getModifiers() дар Синфи 2 кор мекунадҲамин тариқ, ин усулро ҳам ба усулҳои синфӣ ва ҳам ба майдонҳои синфӣ татбиқ кардан мумкин аст. Рамзи майдон чунин хоҳад буд:
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;
    }
}
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION