public native int getModifiers()
کلاس سے ایک طریقہ
Class
اور کلاس سے کچھ مستقل کیسے متعلق ہیں
Modifier
۔
ہم کہتے ہیں کہ ہمارے پاس ایک کلاس ہے:
public static abstract class NestedClass{
}
طریقہ
getModifiers()
نتیجہ کو ایک نمبر کے طور پر لوٹاتا ہے جس میں کلاس یا طریقہ جس سے اسے بلایا جاتا ہے اس کے رسائی میں ترمیم کرنے والے کو انکرپٹ کیا جاتا ہے۔
getModifiers()
کلاس پر کال کرنے کے لیے ، مثال کے طور پر، آپ کو کلاس کے لیے
NestedClass
ایک کلاس آبجیکٹ بنانا ہوگا ۔ اور کال کریں ۔
Class
NestedClass
Class<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);
System.out.printf("\"Is NestedClass interface?\" - %b%n", isInterface);
System.out.printf("\"Is NestedClass abstract?\" - %b%n", isAbstract);
طریقہ کار کی منطق کو کیسے نافذ کیا جائے
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
۔ ایک
PUBLIC
0 ہندسوں کے برابر ہے (دائیں سے سب سے دور)۔ 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
- تو اس طرح کا ایک رسائی موڈیفائر ہے۔
اسی طرح، یہ طریقہ کلاس طریقوں اور کلاس فیلڈز دونوں پر لاگو کیا جا سکتا ہے. فیلڈ کا کوڈ اس طرح نظر آئے گا:
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);
System.out.printf("\"Is A.name final?\" - %b%n", isFinal);
System.out.printf("\"Is A.name volatile?\" - %b%n", isVolatile);
}
public static boolean isModifierSet(int allModifiers, int specificModifier) {
return (allModifiers & specificModifier) > 0;
}
}
GO TO FULL VERSION