Heim >Java >javaLernprogramm >Detaillierte Einführung in die Java-Reflexion zum Abrufen von Klassen- und Objektinformationen
Reflection kann das Problem lösen, dass es zur Kompilierungszeit unmöglich ist, vorherzusagen, zu welchem Objekt und welcher Klasse es gehört, und dass die Informationen des Objekts und der Klasse nur anhand der Informationen bekannt sein können, wenn das Programm ausgeführt wird läuft.
Wenn zwei Personen bei der Entwicklung zusammenarbeiten, müssen Sie nur den Klassennamen der anderen Partei kennen, um die vorläufige Entwicklung durchzuführen.
Statische Methode Class.forName(String clazzName)
Das Klassenattribut der Klasse aufrufen , Person. Klasse gibt das Person-Klassenobjekt zurück (empfohlen)
Rufen Sie die getClass()-Methode eines Objekts auf
Klassenkonstruktor abrufenSpezifische Verwendung Sie müssen immer noch basierend auf den tatsächlichen Bedingungen auswählen. Sie müssen nur einen Klassennamen kennen. Es wird nicht überprüft, ob die Klasse vorhanden ist >Klasseninformationen abrufen
Connstructor8742468051c85b06f0a0af9e3e506b5c getConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getConstructors()
Constructor8742468051c85b06f0a0af9e3e506b5c[] getDeclaredConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredConstructors()
Method getMethod(String name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Method[] getMethods()
Method getDeclaredMethod(string name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Method[] getDeclaredMethods()
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
ff56b21ab54c6b5c37cb9b57f821804eA getAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
ff56b21ab54c6b5c37cb9b57f821804eA getDeclaredAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
Annotation[] getAnnotations()
Annotation[] getDeclaredAnnotations()
ff56b21ab54c6b5c37cb9b57f821804eA[] getAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
ff56b21ab54c6b5c37cb9b57f821804eA[] getDeclaredAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
Class6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredClasses()
Class6b3d0130bba23ae47fe2b8e8cddf0195 getDeclaringClass()
Class117c5a0bdb71ea9a9d0c2b99b03abe3e getSuperclass()
: Gibt das Klassenobjekt der Superklasse der entsprechenden Klasse zurück dieses Klassenobjekts
int getModifiers()
: Rückgabe Die Klasse oder Schnittstelle Alle Modifikatoren bestehen aus öffentlichen, geschützten, privaten, endgültigen, statischen, abstrakten und anderen entsprechenden Konstanten. Die zurückgegebene Ganzzahl sollte mit der Methode der Modifier-Tool-Klasse dekodiert werden, um den echten Modifikator zu erhalten .
Package getPackage()
: Holen Sie sich das Paket dieser Klasse
String getName()
: Geben Sie diese Klasse in Form von String zurück Die Abkürzung der durch das Objekt dargestellten Klasse
boolean isAnnotation()
: Gibt diese Klasse zurück. Ob das Objekt einen Annotationstyp darstellt
boolean isAnnotationPresent(Classe7efc8cbc31a41b0598dead74d6893ddannotationClass)
: Bestimmen Sie, ob dieses Klassenobjekt mit der Klassenanmerkung
: Gibt diese Klasse zurück. Ob das Objekt eine boolean isAnonymousClass()
anonyme Klasse ist
: Gibt zurück, ob dieses Klassenobjekt ein boolean isArray()
Arrayclass
boolean isEnum()
boolean isInterface()
boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object<li> obj )</li></a>
: Bestimmen obj Unabhängig davon, ob es sich um eine Instanz dieses Klassenobjekts handelt, kann diese Methode die Instanz vonOperatorboolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object</a> obj)
public interface Colorable { public void value(); }vollständig ersetzen
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class<Colorable> cls=Colorable.class; System.out.println(cls.getMethod("value")); System.out.println(cls.isAnnotation()); System.out.println(cls.isInterface()); } }
结果
public abstract void com.em.Colorable.value() false true
int getParameterCount()
Parameter[] getParameters()
getModifiers()
String getName()
Type getParameterizedType()
Class6b3d0130bba23ae47fe2b8e8cddf0195getType()
boolean isNamePresent()
boolean isVarArgs()
public class Test { public void getInfo(String str,List<String>list){ System.out.println("成功"); } }
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class<Test> cls=Test.class; Method med=cls.getMethod("getInfo", String.class,List.class); System.out.println(med.getParameterCount()); Parameter[] params=med.getParameters(); System.out.println(params.length); for(Parameter par:params){ System.out.println(par.getName()); System.out.println(par.getType()); System.out.println(par.getParameterizedType()); } } }
结果
durch Reflexion generiertes Objekt
2 2 arg0 class java.lang.String class java.lang.String arg1 interface java.util.List java.util.List<java.lang.String>Verwenden Sie die newInstance()-Methode des Class-Objekts, um eine Instanz des Class-Objekts zu erstellen. Diese Methode erfordert einen Standardkonstruktor (mehr). häufig verwendet)
Object invoke(Object obj,Object...args)
public class Test { public Test(String str) { System.out.println(str); } public void getInfo(String str){ System.out.println(str); } }
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getMethod("getInfo", String.class); med.invoke(test, "调用方法成功"); } }
结果
Als nächstes wird der Beamte genauer hinsehen Schauen Sie sich die Kastanien unten an
初始化 调用方法成功
public class Test { public Test(String str) { System.out.println(str); } //私有方法 private void getInfo(String str){ System.out.println(str); } }
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); //为啥使用这个方法呢? Method med=cls.getDeclaredMethod("getInfo", String.class); //为啥使用这个方法呢? med.setAccessible(true); med.invoke(test, "调用方法成功"); } }
结果
初始化 调用方法成功
Auf den Wert der Mitgliedsvariablen zugreifen
setXxx(Object obj,Xxx val)
public class Test { private int num; public Test(String str) { System.out.println(str); } private void getInfo(String str){ System.out.println(str); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getDeclaredMethod("getInfo", String.class); med.setAccessible(true); med.invoke(test, "调用方法成功"); Field fld=cls.getDeclaredField("num"); fld.setAccessible(true); fld.setInt(test, 12); System.out.println(fld.getInt(test)); } }
结果
Operations-Array
初始化 调用方法成功 12unter java.lang. Reflect-Paket Es gibt eine Array-Klasse, die dynamisch ein Array erstellen kann
: Erstellen Sie ein neues Array mit einem angegebenen Elementtyp und angegebenen Abmessungen
static xxx getXxx(Object array,int index)
:返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()
static void setXxx(Object array,int index,xxx val)
:将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()
public class ArrayInfo { public static void main(String[] args) { Object arrays=Array.newInstance(String.class, 3); Array.set(arrays, 0, "第一个"); Array.set(arrays, 1, "第二个"); Array.set(arrays, 2, "第三个"); System.out.println(Array.get(arrays, 2)); } }
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Java-Reflexion zum Abrufen von Klassen- und Objektinformationen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!