Heim  >  Artikel  >  Java  >  Was Sie zum Reflexionsmechanismus in Java beachten sollten

Was Sie zum Reflexionsmechanismus in Java beachten sollten

黄舟
黄舟Original
2017-09-21 09:51:231560Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Inhalte des Java-Reflexionsmechanismus vorgestellt, einschließlich des dynamischen Ladens von Klassen, des Abrufens von Mitgliedsvariablen, Konstruktorinformationen und anderer Informationen.

Jeder weiß, dass die Java-Klasse von der Java Virtual Machine geladen werden muss, damit ein Java-Programm ausgeführt werden kann. Java-Klassen können nicht normal ausgeführt werden, wenn sie nicht von der Java Virtual Machine geladen werden. Jetzt wissen alle von uns ausgeführten Programme, dass die von Ihnen benötigte Klasse während der Kompilierung geladen wurde.

Javas Reflexionsmechanismus bestimmt nicht, welche Klasse während der Kompilierung geladen wurde, sondern lädt, erkennt und prüft sie nur, wenn das Programm ausgeführt wird. Verwenden Sie Klassen, die zur Kompilierungszeit nicht bekannt sind. Ein solches Merkmal ist Reflexion.

Der Reflexionsmechanismus besteht darin, dass Sie für jede Klasse alle Eigenschaften und Methoden dieser Klasse kennen und diese dynamische Erfassung aufrufen können Informationen und die Funktion des dynamischen Aufrufs der Objektmethoden werden als Reflexionsmechanismus der Java-Sprache bezeichnet.

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

Calss-Nutzung, Reflexion, Konstruktor, Reflexion, Mitglied, Variable, Reflexion

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 hat drei Ausdrücke:


public class User{
} 
public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");
 
//可以通过类的类型创建该类的实例对象
User user=(User)c1.newInstance();
}

2. Dynamisches Laden der Klasse

Class forName (. vollständiger Name der Klasse); Diese Methode repräsentiert nicht nur den Typ der Klasse, sondern auch die dynamisch geladene Klasse. Zur Kompilierungszeit geladene Klassen werden statisch geladen, und zur Laufzeit geladene Klassen werden dynamisch geladen.

3. Abrufen von Methodeninformationen

Grundlegende Datentypen, void-Schlüsselwörter sind Instanzen der Class-Klasse, die Sie verwenden können.
ame ();getSimpleName() ruft den Namen der Klasse ab.


Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());

Holen Sie sich alle Methoden der Klasse und drucken Sie sie aus:


public static void printClassInfo(Object object){
  Class c=object.getClass();
  System.out.println("类的名称:"+c.getName());
  /**
   * 一个成员方法就是一个method对象
   * getMethod()所有的 public方法,包括父类继承的 public
   * getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。
   */
  Method[] methods=c.getMethods();//获取方法
  //获取所以的方法,包括private ,c.getDeclaredMethods();
  for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>


public class ReflectTest {
  public static void main(String[] args){
    String s="ss";
    ClassUtil.printClassInfo(s);
  }
}

Ausführen:


类的名称:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…

4. Informationen zu Mitgliedsvariablen abrufen

Sie können auch die Mitgliedsvariableninformationen der Klasse abrufen


public static void printFiledInfo(Object o){
  Class c=o.getClass();
  /**
  * getFileds()获取public
  * getDeclaredFields()获取所有
  */
  Field[] fileds=c.getDeclaredFields();
  for(Field f:fileds){
   //获取成员变量的类型
   Class filedType=f.getType();
   System.out.println(filedType.getName()+" "+f.getName());
  }
 }


public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    ClassUtil.printFiledInfo(s);
  }

Ausführen:


[C value 
int hash 
long serialVersionUID 
[Ljava.io.ObjectStreamField; serialPersistentFields 
java.util.Comparator CASE_INSENSITIVE_ORDER 
int HASHING_SEED 
int hash32

5. Informationen zum Konstrukteur abrufen


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

Ausführen:


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 ,)
…

6. Methodenreflexionsoperationen

Methode abrufen: Muss Holen Sie sich die Methode. Der Name und die Methodenparameter bestimmen eine Methode. Reflexionsoperation der Methode

:


method.invoke(对象,参数列表);

Zum Beispiel:


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

Ausführen:


20

In diesem Artikel wurde die grundlegende Verwendung von Java Reflection erläutert Klasse, zu der ein beliebiges Objekt zur Laufzeit gehört; Ermitteln Sie zur Laufzeit die Mitgliedsvariablen und Methoden eines beliebigen Objekts.

Das obige ist der detaillierte Inhalt vonWas Sie zum Reflexionsmechanismus in Java beachten sollten. 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