JavaRush /جاوا بلاگ /Random-SD /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. ٽيسٽ ڪلاس ۾ ڪوڊ هن طرح نظر ايندو:
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، تنهنڪري هڪ برابر آهي چوٿين عدد جي. مٿي ڏنل مثال سان قياس سان، اچو ته ڏسو اسان جو NestedClass.class.getModifiers()= 100 0000 1001 Modifier.FINAL. هتي چوٿين عدد 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 0000 0000 -Modifier.ABSTRACT
  • 100 0000 1001 -NestedClass.class.getModifiers()
  • 100 0000 0000 - سڀ کان کاٻي يونٽ ملائي. 10 ۾ تبديل ڪريو: جواب 1024 آهي.
هن جو مطلب آهي ته اسان جي اظهار ۾ returnواپس ايندي true، ڇاڪاڻ ته 1024 > 0 - true. تنهنڪري اتي هڪ اهڙي رسائي موڊيفائر آهي. Reflection API.  ڪيئن 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