JavaRush /Java Blogu /Random-AZ /Reflection API. GetModifiers() metodu Class sinfində necə...
Георгий
Səviyyə
Санкт-Петербург

Reflection API. GetModifiers() metodu Class sinfində necə işləyir

Qrupda dərc edilmişdir
public native int getModifiers()Bir sinifdən metod Classvə sinifdən bəzi sabitlər necə əlaqəlidir Modifier. Reflection API.  GetModifiers() metodu 1-ci sinifdə necə işləyirDeyək ki, bir sinifimiz var:
public static abstract class NestedClass{
}
Metod getModifiers()nəticəni onun çağırıldığı sinif və ya metodun giriş modifikatorlarının şifrələndiyi nömrə kimi qaytarır. Bir sinfə zəng etmək üçün getModifiers(), məsələn, üçün , siz sinif üçün NestedClassbir sinif obyekti yaratmalısınız . Və zəng edin . ClassNestedClassClass<NestedClass>getModifiers()
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Və ya bir sətirdə nəticəni və onun ikili təsvirini göstərin:
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
Yaxşı, amma niyə bu xüsusi nömrə? Sinif nümunəsinə baxaq NestedClass. Deyək ki, bir üsulumuz var:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Onun parametrlərinə aşağıdakılar daxildir: int allModifiers = NestedClass.class.getModifiers()yuxarıdakı nümunədə olduğu kimi. A int specificModifiersinif sabitlərindən birinə bərabər olacaq Modifier: Modifier.PUBLIC, Modifier.STATICvə s. (qalan sabitləri aşağıda nəzərdən keçirəcəyik). trueSinifdə keçid dəyişdiricisi varsa, metod bizə qayıdacaq specificModifier. Əgər olmasa - false. Test sinifindəki kod belə görünəcək:
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
Metodun məntiqini necə həyata keçirmək olar isModifierSet? Sinifdəki dəyişdiriciləri binar sistemdə təmsil edək Modifier: (məsələn, Modifier.FINAL= 0x00000010 və ya 10-cu sistemdə - 16. 16 binar sistemdə = 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
Və biz nə görürük? Hər bir dəyişdirici üçün 10-da elə bir rəqəm alınır ki, 2-də onların 1-i bir yer sola hərəkət edir. Və getModifiers()elə hesablanır ki, əgər sinifdə müəyyən giriş modifikatoru varsa, o zaman giriş modifikatorunda olduğu kimi eyni bit 1-ə bərabər olur. NestedClassAşağıdakı giriş modifikatorlarında: public static abstract. Biri PUBLIC0 rəqəminə bərabərdir (ən sağa doğru). B STATIC- 3. B ABSTRACT- 10. İndi biz özümüzə baxırıq NestedClass.class.getModifiers(): 0, 3 və 10 rəqəmlərində onun bir rəqəmi var! Və qalanların hamısı sıfırdır. Sonra problemin həllinə davam edirik. Xüsusi dəyişdiricimizin olub olmadığını başa düşməliyik getModifiers(). Modifikator üçün vəziyyətə nəzər salaq final. Modifier.FINAL= 16 = 0001 0000, ona görə də biri 4-cü rəqəmə bərabərdir. NestedClass.class.getModifiers()Yuxarıdakı nümunəyə bənzətməklə, bizimki = 100 0000 1001 olub olmadığını görək Modifier.FINAL. Burada 4-cü rəqəm 0-a bərabərdir. Bu o deməkdir ki, onun tərkibində yoxdur, bu doğrudur ( NestedClassdeyil final). Bəs metodda hansı məntiqi yazmalıyam? AND (&)Hər iki bit 1 olarsa, 1 olan məntiqi dəyəri tətbiq etməliyik . Əks halda, 0. Metodumuz nəhayət belə görünəcək:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
        return (allModifiers & specificModifier) > 0;
    }
Kodun işlədiyinə əmin olaq və niyə işlədiyini göstərək. Hesablayırıq NestedClass.class.getModifiers() & Modifier.FINAL:
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 000 0001 0000 - Modifier.FINAL(rahatlıq üçün sola 3 sıfır əlavə edildi)
  • 000 0000 0000 - cavab 0. Bizim vahid vahidimiz yoxdur, çünki yalnız 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Bu o deməkdir ki, bizim ifadəmiz returnqayıdacaq false, çünki 0 > 0 - false. Bu o deməkdir ki, belə giriş modifikatoru yoxdur. Baxaq Modifier.ABSTRACT & NestedClass.class.getModifiers():
  • 100 000 0000 -Modifier.ABSTRACT
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - Ən soldakı vahidlər uyğun gəldi. 10-a çevirin: cavab 1024-dür.
Bu o deməkdir ki, bizim ifadəmiz returnqayıdacaq true, çünki 1024 > 0 - true. Beləliklə, belə bir giriş dəyişdiricisi var. Reflection API.  GetModifiers() metodu 2-ci sinifdə necə işləyirEyni şəkildə, bu üsul həm sinif metodlarına, həm də sinif sahələrinə tətbiq edilə bilər. Sahənin kodu belə görünəcək:
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;
    }
}
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION