Heim  >  Artikel  >  Java  >  Zusammenfassung des Wissens über den Java-Reflexionsmechanismus, der beherrscht werden muss

Zusammenfassung des Wissens über den Java-Reflexionsmechanismus, der beherrscht werden muss

巴扎黑
巴扎黑Original
2017-04-09 10:35:321726Durchsuche
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】


In diesem Artikel wird das Wissen der Reflexion aus den folgenden Aspekten vorgestellt:

Verwendung von Klassen

Methodenreflexion

Konstruktorreflexion

Reflexion von Mitgliedsvariablen

1. Was ist eine Klasse

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();
}

2. Dynamisches Laden der Klasse

Class.forName (vollständiger Name der Klasse); die Klasse. Zur Kompilierungszeit geladene Klassen werden statisch geladen, und zur Laufzeit geladene Klassen werden dynamisch geladen.

3. Abrufen von Methodeninformationen

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){

Class c=o.getClass();
类的名称:java.lang.String

booleanequals(java.lang.Object,)

java.lang.StringtoString()

inthashCode()

…
/**

* getFileds() wird öffentlich

* getDeclaredFields() erhält alles

*/
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn