Kepiye cara
public native int getModifiers()
saka kelas Class
lan sawetara konstanta saka kelas sing ana gandhengane Modifier
. Ayo kita duwe kelas:
public static abstract class NestedClass{
}
Cara kasebut getModifiers()
ngasilake asil minangka nomer ing ngendi modifiers akses saka kelas utawa cara sing diarani dienkripsi. Kanggo nelpon ing getModifiers()
kelas, contone kanggo NestedClass
, sampeyan kudu nggawe obyek kelas Class
kanggo kelas NestedClass
. Lan Class<NestedClass>
nelpon getModifiers()
.
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Utawa ing siji baris lan nampilake asil lan perwakilan binar:
int classModifiers = NestedClass.class.getModifiers();
System.out.printf("classModifier = %d%n",classModifiers);
System.out.printf("classModifier в двоичной системе счисления = %s%n",Integer.toBinaryString(classModifiers));
Ing layar:
classModifiers = 1033
classModifiers в двоичной системе счисления = 10000001001
Oke, nanging kenapa nomer tartamtu iki? Ayo deleng conto kelas kasebut NestedClass
. Ayo kita duwe metode:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Paramèter kasebut bakal kalebu: int allModifiers = NestedClass.class.getModifiers()
, kaya ing conto ing ndhuwur. A int specificModifier
bakal padha karo salah siji saka konstanta kelas Modifier
: Modifier.PUBLIC
, Modifier.STATIC
etc. (kita bakal nimbang tetep tetep ing ngisor iki). Lan cara bakal bali kanggo kita true
yen kelas ngemot modifier akses liwati menyang specificModifier
. Yen ora - false
. Kode ing kelas test bakal katon kaya iki:
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
Kepiye cara ngetrapake logika metode kasebut isModifierSet
? Ayo makili modifiers ing kelas ing sistem binar Modifier
: (contone, Modifier.FINAL
= 0x00000010, utawa ing sistem kaping 10 - 16. 16 ing binar = 00010000)
Modifier.PUBLIC
= 1 = 0000 0001Modifier.PRIVATE
= 2 = 0000 0010Modifier.PROTECTED
= 4 = 0000 0100Modifier.STATIC
= 8 = 0000 1000Modifier.FINAL
= 16 = 0001 0000Modifier.SYNCHRONIZED
= 32 = 0010 0000Modifier.VOLATILE
= 64 = 0100 0000Modifier.TRANSIENT
= 128 = 1000 0000Modifier.NATIVE
= 256 = 1 0000 0000Modifier.INTERFACE
= 512 = 10 0000 0000Modifier.ABSTRACT
= 1024 = 100 0000 0000NestedClass.class.getModifiers()
= 1033 = 100 0000 1001
getModifiers()
wis diwilang ing kuwi cara yen kelas ngemot modifier akses tartamtu, banjur dicokot padha ing modifier akses dadi padha karo 1. Ing NestedClass
modifiers akses ing ngisor iki public
static
abstract
:. Siji PUBLIC
padha karo 0 digit (paling adoh ing sisih tengen). B STATIC
- 3. B ABSTRACT
- 10. Lan saiki kita katon ing kita NestedClass.class.getModifiers()
: Ing 0, 3 lan 10 digit wis siji! Lan kabeh liyane nol. Sabanjure kita nerusake kanggo ngrampungake masalah. Kita kudu ngerti apa getModifiers()
modifier spesifik kita ngemot. Ayo nimbang kasus kanggo modifier final
. Modifier.FINAL
= 16 = 0001 0000, dadi siji padha karo digit kaping 4. Miturut analogi karo conto ing ndhuwur, ayo padha ndeleng yen kita NestedClass.class.getModifiers()
= 100 0000 1001 Modifier.FINAL
. Ing kene angka 4 padha karo 0. Iki tegese ora ngemot, sing bener ( NestedClass
ora final
). Nanging apa logika aku kudu nulis ing cara? Kita kudu ngetrapake nilai logis AND (&)
, yaiku 1 yen loro bit 1. Yen ora, 0. Cara kita pungkasane bakal katon kaya iki:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
return (allModifiers & specificModifier) > 0;
}
Ayo priksa manawa kode kasebut bisa digunakake lan nuduhake apa sebabe. Kita ngitung NestedClass.class.getModifiers() & Modifier.FINAL
:
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 000 0001 0000 -
Modifier.FINAL
(ditambahake 3 nul ing sisih kiwa kanggo penak) - 000 0000 0000 - jawaban 0. Kita ora duwe unit siji, amarga mung 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
return
bakal bali false
, amarga 0 > 0 - false
. Iki tegese ora ana modifier akses kasebut. Ayo katon Modifier.ABSTRACT & NestedClass.class.getModifiers()
:
- 100 0000 0000 -
Modifier.ABSTRACT
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 100 0000 0000 - Unit paling kiwa cocog. Ngonversi menyang 10: jawabane 1024.
return
bakal bali true
, amarga 1024 > 0 - true
. Dadi ana modifier akses kasebut. Kanthi cara sing padha, metode iki bisa ditrapake kanggo metode kelas lan lapangan kelas. Kode kanggo lapangan bakal katon kaya iki:
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;
}
}
GO TO FULL VERSION