public native int getModifiers()
Bir synpdan usul
Class
we synpdan käbir yzygiderlilik nähili baglanyşykly
Modifier
.
Synpymyz bar diýeliň:
public static abstract class NestedClass{
}
Usul, netijäni
getModifiers()
synpyň giriş üýtgeýjileriniň ýa-da atlandyrylan usuly şifrlenen san hökmünde gaýtaryp berýär.
getModifiers()
Mysal üçin, bir klasa jaň etmek üçin synp üçin
NestedClass
synp obýektini döretmeli . Jaň ediň .
Class
NestedClass
Class<NestedClass>
getModifiers()
Class<NestedClass> c = NestedClass.class;
int classModifiers = c.getModifiers();
Ora-da bir setirde netijäni we ikilik şekillendirişini görkeziň:
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
Bolýar, ýöne näme üçin bu aýratyn san? Synpyň mysalyna seredeliň
NestedClass
. Usulymyz bar diýeliň:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
}
Onuň parametrleri aşakdakylary öz içine alar:
int allModifiers = NestedClass.class.getModifiers()
ýokardaky mysaldaky ýaly. A
int specificModifier
synp yzygiderliliginiň birine deň bolar
Modifier
:
Modifier.PUBLIC
we
Modifier.STATIC
ş.m. (aşakda galan yzygiderliligi göz öňünde tutarys).
true
Eger synpda giriş ygtyýar üýtgedijisi bar bolsa, usul bize gaýdyp geler
specificModifier
. Däl bolsa -
false
. Synag synpyndaky kod şeýle bolar:
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);
Usulyň logikasyny nädip durmuşa geçirmeli
isModifierSet
? Ikilik ulgamynda synpdaky üýtgeýjileri görkezeliň
Modifier
: (mysal üçin,
Modifier.FINAL
= 0x00000010, ýa-da 10-njy ulgamda - 16. 16 ikilik = 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
Biz näme görýäris? Her üýtgediji üçin 10-da bir san şeýle alynýar welin, 2-nji ýerde 1-i bir ýeri çepe geçirýär. Şeýlelik
getModifiers()
bilen hasaplanýar, eger bir synpda belli bir giriş üýtgeýjisi bar bolsa, giriş modifikatoryndaky ýaly bir zat 1-e deň bolar.
NestedClass
Aşakdaky giriş üýtgeýjilerinde :
public
static
abstract
. Biri
PUBLIC
0 belgä deňdir (sagdan iň uzakda). B
STATIC
- 3. B
ABSTRACT
- 10. Indi bolsa özümize seredýäris
NestedClass.class.getModifiers()
: 0, 3 we 10 sanlarda bir bar! Galanlaryň hemmesi nola deň. Soň bolsa meseläni çözmäge geçeris. Specificörite üýtgedijimiziň bardygyny ýa-da ýokdugyna düşünmelidiris
getModifiers()
. Üýtgediji üçin meselä seredeliň
final
.
Modifier.FINAL
= 16 = 0001 0000, şonuň üçin biri 4-nji belgä deňdir. Aboveokardaky mysal bilen meňzeşlik bilen, geliň, özümiziň
NestedClass.class.getModifiers()
= 100 0000 1001 ýa-da däldigini göreliň
Modifier.FINAL
. Bu ýerde 4-nji san 0-a deňdir. Diýmek, ol öz içine almaýar, bu dogry (
NestedClass
ýok
final
). Methodöne usulda haýsy logika ýazmaly? Logiki bahany ulanmalydyrys
AND (&)
, eger iki bit bolsa 1 bolýar. Otherwiseogsam, 0. Usulymyz ahyrsoňy şeýle bolar:
public static boolean isModifierSet(int allModifiers, int specificModifier) {
return (allModifiers & specificModifier) > 0;
}
Kodyň işleýändigine göz ýetiriň we näme üçin işleýändigini görkezeliň. Hasaplaýarys
NestedClass.class.getModifiers() & Modifier.FINAL
:
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 000 0001 0000 -
Modifier.FINAL
(amatlylyk üçin çepe 3 nol goşuldy)
- 000 0000 0000 - jogap 0. Bizde ýekeje bölüm ýok, sebäbi diňe 1 & 1 = 1. 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0;
Bu, biziň aňlatmamyzyň
return
gaýdyp geljekdigini aňladýar
false
, sebäbi 0> 0 -
false
. Diýmek, beýle giriş üýtgediji ýok. Geliň seredeliň
Modifier.ABSTRACT & NestedClass.class.getModifiers()
:
- 100 0000 0000 -
Modifier.ABSTRACT
- 100 0000 1001 -
NestedClass.class.getModifiers()
- 100 0000 0000 - Iň çep bölümler gabat geldi. 10-a öwüriň: jogap 1024.
Bu, biziň aňlatmamyzyň
return
gaýdyp geljekdigini aňladýar
true
, sebäbi 1024> 0 -
true
. Şonuň üçin şeýle giriş üýtgediji bar.
Edil şonuň ýaly, bu usul synp usullaryna-da, synp meýdanlaryna-da ulanylyp bilner. Meýdanyň kody şeýle bolar:
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