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هين ۾ هڪ عدد اهڙي طرح ورتو ويندو آهي، جيئن 2هين ۾، انهن جو 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