JavaRush /جاوا بلاگ /Random-UR /ریفلیکشن API۔ getModifiers() طریقہ کلاس کلاس میں کیسے کام...
Георгий
سطح
Санкт-Петербург

ریفلیکشن API۔ getModifiers() طریقہ کلاس کلاس میں کیسے کام کرتا ہے۔

گروپ میں شائع ہوا۔
public native int getModifiers()کلاس سے ایک طریقہ Classاور کلاس سے کچھ مستقل کیسے متعلق ہیں Modifier۔ ریفلیکشن 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ویں نمبر میں اس طرح لیا جاتا ہے کہ 2nd میں، ان کا 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- تو اس طرح کا ایک رسائی موڈیفائر ہے۔ ریفلیکشن 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