反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】
Cet article présentera la connaissance de la réflexion sous les aspects suivants :
Utilisation de la classe
Méthode de réflexion
Réflexion du constructeur
Réflexion des variables membres
Dans le monde orienté objet, tout est un 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 d'instance a trois méthodes d'expression :
public class User{
}
public class ClassTest{
User u=new User();
//Méthode 1 :
Classe c1=User.class;
//Méthode 2:
Classe c2=u.getClass();
//Méthode 3:
Classe c3=Class.forName(" com.forezp.User");
//Vous pouvez créer un objet instance de la classe via le type de la classe
User user=(User)c1.newInstance();
}
Class.forName (nom complet de la classe) représente non seulement le type de la classe, mais représente également le chargement dynamique de la classe. Les classes chargées au moment de la compilation sont chargées statiquement et les classes chargées au moment de l'exécution sont chargées dynamiquement.
Les types de données de base et les mots-clés void sont des instances de la classe Class ; le nom de la classe peut être obtenu via getame(); () .
Classe c1=String.class;
Classe c2=int.class;
Classe 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("Nom de classe : "+c.getName());
/**
* Une méthode membre est un objet méthode
* * getMethod() récupère toutes les méthodes publiques, y compris celles héritées de la classe parent
* getDeclaredMethods() récupère toutes les méthodes de la classe, y compris privées, mais pas de méthode héritée.
*/
Method[] méthodes= c.getMethods();//Obtenir les méthodes
//Obtenir toutes les méthodes, y compris privées, c.getDeclaredMethods();
for(int i=0;i
System.out.print(methods[i].getName()+" (");
Class[] ParameterTypes=methods[i].getParameterTypes();
for(Class class1:parameterTypes){
System.out.print(class1.getName()+ ","); }
classe publique ReflectTest {
public static void main(String[] args){
String s="ss";
ClassUtil.printClassInfo(s);
>
}
Exécuter :
4. Obtenez les informations sur la variable membre
Vous pouvez également obtenir les informations sur la variable membre de les fichiers class
public static void printFiledInfo(Object o){
类的名称:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() …Class c=o.getClass();
* getDeclaredFields() obtient tout
*/
Field[] =c.getDeclaredFields();
for(Field f:fileds){
" "+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 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反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
Ce 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!