Le mécanisme de réflexion est qu'à l'état d'exécution, pour n'importe quelle classe, vous pouvez connaître toutes les propriétés et méthodes de cette classe ; pour n'importe quel objet, vous pouvez appeler n'importe laquelle de ses méthodes et propriétés ; Les informations et la fonction d'appel dynamique des méthodes de l'objet sont appelées mécanisme de réflexion du langage Java. [Traduit des documents officiels]
Cet article présentera la connaissance de la réflexion sous les aspects suivants :
Méthode de réflexion
ConstructeurRéflexion
MembreRéflexion de variable
Dans le monde orienté objet, tout est objet. Les classes sont des objets et les classes sont des objets d'instance de la classe java.lang.Class. De plus, la classe class ne peut être nouvelle que par la machine virtuelle Java. Toute classe est un objet instance de la classe Class. Cet objet instance a trois expressions :
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(); }
Class.forName (nom complet de la classe) ; mais représente également des classes chargées dynamiquement. Les classes chargées au moment de la compilation sont statiques chargées et les classes chargées au moment de l'exécution sont chargées dynamiquement.
type de données de base, le mot-clé void est une instance de la classe Class, vous pouvez obtenir le nom de la classe via getame(); ) .
Class c1=String.class; Class c2=int.class; Class c3=void.class; System.out.println(c1.getName()); System.out.println(c2.getSimpleName());
Récupérez toutes les méthodes de la classe et imprimez-les :
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++){ //得到方法的返回类型 Class returnType=methods[i].getReturnType(); System.out.print(returnType.getName()); //得到方法名: System.out.print(methods[i].getName()+"("); Class[] parameterTypes=methods[i].getParameterTypes(); for(Class class1:parameterTypes){ System.out.print(class1.getName()+","); } System.out.println(")"); } }
public class ReflectTest { public static void main(String[] args){ String s="ss"; ClassUtil.printClassInfo(s); } }
Exécutez :
类的名称:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() …Copier après la connexion
Vous pouvez également obtenir les informations sur la variable membre de la classe
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); }
Exécuter :
[C value int hash long serialVersionUID [Ljava.io.ObjectStreamField; serialPersistentFields java.util.Comparator CASE_INSENSITIVE_ORDER int HASHING_SEED int hash32Copier après la connexion
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); }
Exécuter :
java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.char set .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 ,)Copier après la connexion
Obtenir une méthode : Vous devez obtenir le nom de la méthode et les paramètres de la méthode pour déterminer une méthode. Opération de réflexion de la méthode
:
method.invoke(对象,参数列表);
Par exemple :
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(); } }
Exécuter :
20Copier après la connexionCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!