JavaRush /Java блогы /Random-KK /Reflection API. getModifiers() әдісі Класс сыныбында қала...
Георгий
Деңгей
Санкт-Петербург

Reflection API. getModifiers() әдісі Класс сыныбында қалай жұмыс істейді

Топта жарияланған
public native int getModifiers()Сыныптағы әдіс Classпен сыныптағы кейбір тұрақтылар қалай байланысты Modifier. Reflection API.  getModifiers() әдісі 1-сыныпта қалай жұмыс істейдіБізде сынып бар делік:
public static abstract class NestedClass{
}
Әдіс getModifiers()нәтижені сыныптың немесе ол шақырылатын әдістің қатынас модификаторлары шифрланған сан ретінде қайтарады. Сыныпқа қоңырау шалу үшін getModifiers(), мысалы, үшін , сынып үшін NestedClassсынып нысанын жасау керек . Және қоңырау шалыңыз . ClassNestedClassClass<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. Сынақ класындағы code келесідей болады:
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 0000 0000
  • Modifier.ABSTRACT = 1024 = 100 0000 0000
  • NestedClass.class.getModifiers()= 1033 = 100 0000 1001
Ал біз не көріп тұрмыз? Әрбір модификатор үшін 10-шы сан алынады, 2-шіде олардың 1-і бір орынға солға жылжиды. Және getModifiers()ол сыныпта белгілі бір қол жеткізу модификаторы болса, қатынас модификаторындағы бит 1-ге тең болатындай етіп есептеледі. NestedClassКелесі қатынас модификаторларында: public static abstract. Бірі PUBLIC0 цифрына тең (ең алыс оңға қарай). 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;
    }
Кодтың жұмыс істейтініне көз жеткізіп, оның неге жұмыс істейтінін көрсетейік. Біз есептейміз NestedClass.class.getModifiers() & Modifier.FINAL:
  • 100 0000 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 0000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - Ең сол жақ бірлік сәйкес келді. 10-ға аударыңыз: жауап 1024.
Бұл біздің өрнегіміз returnқайтарылатынын білдіреді true, өйткені 1024 > 0 - true. Сондықтан мұндай қол жеткізу модификаторы бар. Reflection API.  getModifiers() әдісі 2-сыныпта қалай жұмыс істейдіДәл осылай бұл әдіс класс әдістеріне де, класс өрістеріне де қолданылуы мүмкін. Өріс codeы келесідей болады:
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