反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】
In diesem Artikel wird das Wissen der Reflexion aus den folgenden Aspekten vorgestellt:
Verwendung von Klassen
Methodenreflexion
Konstruktorreflexion
Reflexion von Mitgliedsvariablen
In der objektorientierten Welt ist alles ein Objekt. Klassen sind Objekte und Klassen sind Instanzobjekte der Klasse java.lang.Class. Darüber hinaus kann die Klassenklasse nur von der Java Virtual Machine neu sein. Jede Klasse ist ein Instanzobjekt der Class-Klasse. Dieses Instanzobjekt verfügt über drei Ausdrucksmethoden:
public class User{
}
public class ClassTest{
User u=new User();
//Methode 1 :
Klasse c1=User.class;
//Methode 2:
Klasse c2=u.getClass();
//Methode 3:
Klasse c3=Class.forName(" com.forezp.User");
//Sie können ein Instanzobjekt der Klasse über den Typ der Klasse erstellen
Benutzer user=(User)c1.newInstance();
}
Class.forName (vollständiger Name der Klasse); die Klasse. Zur Kompilierungszeit geladene Klassen werden statisch geladen, und zur Laufzeit geladene Klassen werden dynamisch geladen.
Basisdatentypen und void-Schlüsselwörter sind Instanzen der Class-Klasse; der Name der Klasse kann über getSimpleName abgerufen werden () .
Klasse c1=String.class;
Klasse c2=int.class;
Klasse c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());
Alle Methoden der Klasse abrufen und ausdrucken:
public static void printClassInfo(Object object){
Klasse c= object .getClass();
System.out.println("Klassenname: "+c.getName());
/**
* Eine Mitgliedsmethode ist ein Methodenobjekt
* * getMethod() ruft alle öffentlichen Methoden ab, einschließlich der von der übergeordneten Klasse geerbten
* getDeclaredMethods() ruft alle Methoden der Klasse ab, einschließlich privater, aber keine geerbte Methode.
*/
Method[] Methoden= c.getMethods();//Methoden abrufen
//Alle Methoden abrufen, einschließlich private, c.getDeclaredMethods();
for(int i=0;i
Class[] parameterTypes=methods[i].getParameterTypes();
for(Class class1:parameterTypes){
System.out.print(class1.getName()+ ","); }
public class ReflectTest {
public static void main(String[] args){
String s="ss";
ClassUtil.printClassInfo(s);
}
}
Ausführen:
4. Holen Sie sich die Mitgliedsvariableninformationen
Sie können auch die Mitgliedsvariableninformationen von abrufen die Klasse
public static void printFiledInfo(Object o){
类的名称:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() …
*/
Field[] fileds =c.getDeclaredFields();
for(Field f:fileds){
" "+f.getName());
}
}
public static void main(String[] args){
🎜 >
[C value int hash long serialVersionUID [Ljava.io.ObjectStreamField; serialPersistentFields java.util.Comparator CASE_INSENSITIVE_ORDER int HASHING_SEED int hash32
public static void printConstructInfo(Object o){
Class c=o.getClass();
Constructor[] constructors=c.getDeclaredConstructors();
for (Constructor con:constructors){
System.out.print(con.getName()+”(“);
Class[] typeParas=con.getParameterTypes();
for (Class class1:typeParas){
System.out.print(class1.getName()+” ,”);
}
System.out.println(“)”);
}
}
public static void main(String[] args){
String s="ss";
//ClassUtil.printClassInfo(s);
//ClassUtil.printFiledInfo(s);
ClassUtil.printConstructInfo(s);
}
运行:
java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.charset.Charset ,) java.lang.String([B ,java.lang.String ,) java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) java.lang.String(int ,int ,[C ,) java.lang.String([C ,boolean ,) java.lang.String(java.lang.StringBuilder ,) java.lang.String(java.lang.StringBuffer ,) ...
获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。
方法的反射操作:
method.invoke(对象,参数列表);
举个例子:
class A{
public void add(int a,int b){
System.out.print(a+b);
}
public void toUpper(String a){
System.out.print(a.toUpperCase());
}
}
public static void main(String[] args) {
A a=new A();
Class c=a.getClass();
try {
Method method=c.getMethod("add",new Class[]{int.class,int.class});
//也可以 Method method=c.getMethod("add",int.class,int.class);
//方法的反射操作
method.invoke(a,10,10);
}catch (Exception e){
e.printStackTrace();
}
}
运行:
20
本篇文章已经讲解了java反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
Das obige ist der detaillierte Inhalt vonZusammenfassung des Wissens über den Java-Reflexionsmechanismus, der beherrscht werden muss. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!