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

Reflection API. getModifiers() методу Класс классында кантип иштейт

Группада жарыяланган
public native int getModifiers()Класстын методу Classменен класстын кээ бир туруктуулары кандайча байланышкан Modifier. Reflection API.  getModifiers() методу 1-класста кантип иштейтБизде класс бар дейли:
public static abstract class NestedClass{
}
Метод getModifiers()натыйжаны ал чакырылган класстын же методдун кирүү модификаторлору шифрленген сан катары кайтарат. Классты чакыруу үчүн getModifiers(), мисалы үчүн , класс үчүн NestedClassкласс an objectин түзүшүңүз керек . Жана чал . 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гө барабар. Бул анын камтыbyte дегенди билдирет, бул чындык ( 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 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