public native int getModifiers()
Sinfdagi usul
Class
va sinfdagi ba'zi doimiylar qanday bog'liq
Modifier
.
Aytaylik, bizda sinf bor:
public static abstract class NestedClass{
}
Usul
getModifiers()
natijani sinf yoki u chaqirilgan usulning kirish modifikatorlari shifrlangan raqam sifatida qaytaradi. Sinfga qo'ng'iroq qilish uchun
getModifiers()
, masalan, uchun , siz sinf uchun
NestedClass
sinf ob'ektini yaratishingiz kerak . Va qo'ng'iroq qiling .
Class
NestedClass
Class<NestedClass>
getModifiers()
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Yoki bitta satrda natijani va uning ikkilik ko'rinishini ko'rsating:
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
Yaxshi, lekin nima uchun bu raqam? Keling, sinf misolini ko'rib chiqaylik
NestedClass
. Aytaylik, bizda bir usul bor:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Uning parametrlariga quyidagilar kiradi:
int allModifiers = NestedClass.class.getModifiers()
, yuqoridagi misolda bo'lgani kabi. A
int specificModifier
sinf konstantalaridan biriga teng bo'ladi
Modifier
:
Modifier.PUBLIC
,
Modifier.STATIC
va hokazo. (qolgan konstantalarni quyida ko'rib chiqamiz).
true
Agar sinfda ga o'tkazilgan kirish o'zgartiruvchisi bo'lsa, usul bizga qaytadi
specificModifier
. Agar unday bo'lmasa -
false
. Sinov sinfidagi kod quyidagicha ko'rinadi:
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);
Usul mantiqini qanday amalga oshirish kerak
isModifierSet
? Ikkilik tizimda sinfdagi modifikatorlarni ifodalaymiz
Modifier
: (masalan,
Modifier.FINAL
= 0x00000010, yoki 10-tizimda - 16. 16 ikkilik tizimda = 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
Va biz nimani ko'ramiz? Har bir modifikator uchun 10-da shunday raqam olinadiki, 2-da ularning 1-si bir o'ringa chapga siljiydi. Va
getModifiers()
shunday hisoblab chiqilganki, agar sinfda ma'lum bir kirish modifikatori bo'lsa, u holda kirish modifikatoridagi bir xil bit 1 ga teng bo'ladi. Quyidagi
NestedClass
kirish modifikatorlarida:
public
static
abstract
. Biri
PUBLIC
0 raqamiga teng (eng o'ngda). B
STATIC
- 3. B
ABSTRACT
- 10. Va endi biz o'zimiznikiga qaraymiz
NestedClass.class.getModifiers()
: 0, 3 va 10 raqamlarida u bitta raqamga ega! Qolganlari esa nolga teng. Keyinchalik muammoni hal qilishga o'tamiz. Bizning maxsus modifikatorimiz bor yoki yo'qligini tushunishimiz kerak
getModifiers()
. Keling, modifikator uchun vaziyatni ko'rib chiqaylik
final
.
Modifier.FINAL
= 16 = 0001 0000, shuning uchun bittasi 4-raqamga teng. Yuqoridagi misolga o'xshatib, bizniki
NestedClass.class.getModifiers()
= 100 0000 1001 ekanligini bilib olaylik
Modifier.FINAL
. Bu erda 4-raqam 0 ga teng. Bu unda mavjud emas degan ma'noni anglatadi, bu to'g'ri (
NestedClass
emas
final
). Lekin usulda qanday mantiqni yozishim kerak? Biz mantiqiy qiymatni qo'llashimiz kerak
AND (&)
, agar ikkala bit ham 1 bo'lsa, u 1 ga teng. Aks holda, 0. Bizning usulimiz nihoyat quyidagicha ko'rinadi:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
return (allModifiers & specificModifier) > 0;
}
Keling, kod ishlayotganiga ishonch hosil qilaylik va nima uchun ishlashini ko'rsatamiz. Biz hisoblaymiz
NestedClass.class.getModifiers() & Modifier.FINAL
:
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 000 0001 0000 -
Modifier.FINAL
(qulaylik uchun chapga 3 ta nol qo'shildi)
- 000 0000 0000 - javob 0. Bizda bitta birlik yo'q, chunki faqat 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Bu shuni anglatadiki, bizning ifodamiz
return
qaytib keladi
false
, chunki 0 > 0 -
false
. Bu shuni anglatadiki, bunday kirish modifikatori mavjud emas. Keling, qaraylik
Modifier.ABSTRACT & NestedClass.class.getModifiers()
:
- 100 000 0000 -
Modifier.ABSTRACT
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 100 0000 0000 - Eng chap birliklar mos keldi. 10-ga aylantiring: javob 1024.
Bu bizning ifodamiz
return
qaytib kelishini anglatadi
true
, chunki 1024 > 0 -
true
. Shunday qilib, bunday kirish modifikatori mavjud.
Xuddi shu tarzda, bu usul ham sinf usullariga, ham sinf maydonlariga qo'llanilishi mumkin. Maydon uchun kod quyidagicha ko'rinadi:
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