Maison > Java > javaDidacticiel > 08.Bases de Java - Réflexion

08.Bases de Java - Réflexion

黄舟
Libérer: 2017-02-27 10:35:23
original
1117 Les gens l'ont consulté


Concepts de base


Le mécanisme de réflexion Java nous permet de compiler le temps pendant )Sauf le runtime (Runtime) pour vérifier les informations sur la classe, l'interface, la variable et la méthode.

Les fonctions de réflexion sont les suivantes :

  • 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.


Class

Pour obtenir des informations sur une classe, vous devez d'abord obtenir l'objet Class de la classe.

Tous les types en Java incluent des types de base (int, long, float, etc.), même les tableaux sont associés à des objets Class.

  • Récupérer l'objet de la classe

//1.在编译期获取类对象Class cls = Demo.class 

//2.在运行期获取类对象(注意:需要包括完整的包名) Cllss clas = Class.forName("com.test.Demo")
Copier après la connexion
  • Récupérer le nom de la classe

Class cls = ...// 1.获取完整类型(包括包名)String className = cls.getName();
// 2.获取简单类名 String simpleClassName =cls.getSimpleName();
Copier après la connexion
  • Obtenir le modificateur de la classe

Class cls = ...// 修饰符都被包装成一个 int 类型的数字,这样每个修饰符都是一个位标识(flag bit)    
int modifiers  = cls.getModifiers();// 判断修饰符类型Modifier.isPublic( modifiers);
Modifier.isProtected( modifiers);
Modifier.isPrivate( modifiers);
Modifier.isAbstract( modifiers);
Modifier.isInterface( modifiers);
Modifier.isFinal( modifiers);
Modifier.isStatic( modifiers);
Modifier.isNative( modifiers);
Modifier.isStrict( modifiers);
Modifier.isSynchronized( modifiers);
Modifier.isTransient( modifiers);
Modifier.isVolatile( modifiers);
Copier après la connexion
  • Obtenez les informations sur le forfait de la classe

Class cls =...
Package p = cls.getPackage();
Copier après la connexion
  • Obtenez le classe parent dont la classe hérite

Class cls = ...
Class superClass  = cls.getSuperclass();
Copier après la connexion
  • Obtenir le type d'interface implémenté par la classe

Class cls = ...// 类可以实现多个接口,因此返回的是接口数组Class [ ] interfaces = cls.getInterfaces();
Copier après la connexion

Constructeur

En Java, la classe Constructor représente un objet constructeur.

  • Obtenir

    PublicConstructeur

Class cls = ...// 1.获取所有构造函数Constructor[] constructors = cls.getConstructors(); 

// 2.获取指定构造函数,不存在匹配则抛出异常。
// 对应的构造函数入参类为 Person(String str, int i)Constructor constructor = 
    cls.getConstructor(new Class[]{String.class,int.class});
Copier après la connexion
  • Obtenir le paramètre d'entrée du constructeur tapez

Constructor constructor = ...
// 因为构造函数的入参有多个,因此返回的数组Class [] paramterTypes = constructor.getParameterTypes();
for(Class paramterType: paramterTypes ){    
// do something...}
Copier après la connexion
  • Classe d'instanciation du constructeur

Class cls = ...
Constructor constructor = cls.getConstructor(new Class[]{String.class});
// Object[] 数组表示入参的具体值,需要与 Class[] 的入参类型完全匹配Demo demo = (Demo) constructor.newInstance(new Object[]{"hello"});
Copier après la connexion

Field

En Java, la classe Field représente un objet variable.

  • Obtenir toutes les variables (publiques, non publiques)

Class cls = ...// 1.获取所有公共变量Field[] fields = cls.getFields();
// 2.获取所有非公共变量Field [] privateFields =cls.getDeclaredFields();
Copier après la connexion
  • Obtenir la variable spécifiée (publique, non publique)

Class cls = ...//入参为变量名称,名称不匹配则抛出异常// 获取指定公共变量Field field = cls.getField("num");
// 获取指定非公共变量Field privateField = cls.getDeclaredField("str");
Copier après la connexion
  • Manipuler la variable

Class<?> cls = Demo.class;
Demo demo = (Demo) cls.newInstance();// 1.1.公共方法的 setter、getterField field = cls.getField("num");
field.set(demo, 1000);int filedValue  = (Integer) field.get(demo);// 2.1 非公共方法的 setter、getterField privateField = cls.getDeclaredField("str");
privateField.setAccessible(true); // 关键 -> 操作之前,需要设置访问权限privateField.set(demo, "hello");
String privateFieldValue = (String) privateField.get(demo);
Copier après la connexion

Méthode

1. Récupérer l'objet méthode

  • Obtenir toutes les méthodes

Class cls = ...// 1.获取所有公共方法(包括从父类继承而来的)Method[] methods = cls.getMethods();
// 2.获取所有非公共方法(包括从父类继承而来的)Method [] privateMethods = cls.getDeclaredMethods();
Copier après la connexion
  • Obtenir la méthode spécifiée

Class cls = ...// 1.获取指定公共方法,入参为:方法名、方法入参Method method = cls.getMethod("print", new Class[]{String.class});
// 2.获取指定非公共方法,入参为:方法名、方法入参Method privateMethod = cls.getDeclaredMethod("say", new Class[]{int.class});
Copier après la connexion
  • Récupérer le type de paramètre de la méthode

Method method = ...// 1.获取方法的所有入参类型Class [] paramterTypes = method.getParameterTypes();
// 2.获取方法的返回值类型Class reeturnType = method.getReturnType();
Copier après la connexion
  • Exécuter la méthode

Class cls = Demo.class;
Demo demo = (Demo) cls.newInstance();
Method method = cls.getMethod("print", new Class[]{String.class});//1.执行公用方法,入参为:类实例,方法入参的具体值method.invoke(demo, "hello");
//2.执行非公共方法Method privateMethod = 
    cls.getDeclaredMethod("print", new Class[]{String.class});
privateMethod.setAccessible(true); // 关键 -> 操作之前,需要获得访问权限privateMethod.invoke(demo, "hello");
Copier après la connexion
  • Méthode getter/setter du juge

public static boolean isGetter(Method method){    
if(!method.getName().startsWith("get")){        
return false;
    }    
    if(method.getParameterTypes().length !=0){        
    return false;
    }    
    if(void.class.equals(method.getReturnType())){        
    return false;
    }    
    return true;
}
public static boolean isSetter(Method method){    
if(!method.getName().startsWith("set")){        
return false;
    }    
    if(method.getParameterTypes().length !=1){        
    return false;
    }    
    return true;
}
Copier après la connexion

Array

En Java, la classe Array est utilisée pour représenter des objets tableau.

  • Obtenir un objet de tableau

int [ ] intArray = ... 
Class arrayCls = intArray.class;
Copier après la connexion
  • Obtenir le type de membre du tableau

Class arrayCls = ...
Class arrayComponentType =arrayCls .getComponentType();
Copier après la connexion
  • Créer un tableau

// 创建一个数组,类型为 int ,容量为 3int [ ] intArray = (int[]) Array.newInstance(int.class, 3);
//在 JVM 中字母I代表int类型,左边的‘[’代表我想要的是一个int类型的数组Class intArrayClass = Class.forName("[I");  

//注意‘[L’的右边是类名,类名的右边是一个‘;’符号。这个的含义是一个指定类型的数组。
 stringArrayClass = Class.forName("[Ljava.lang.String;");
Copier après la connexion
  • Ajouter des éléments de tableau

int [ ] intArray = ...// 添加元素,数组为 intArray,位置为 0 ,值为 100Array.set(intArray, 0, 100);
Array.set(intArray, 1, 200);
System.out.println("intArray[0] = " + Array.get(intArray, 0));
System.out.println("intArray[1] = " + Array.get(intArray, 1));
Copier après la connexion
Ce qui précède est le contenu de 08.Java Basics - Reflection Pour plus de contenu connexe, veuillez faire attention au PHP. Site chinois (www.php .cn) !



Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal