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

08.Bases de Java - Réflexion

黄舟
黄舟original
2017-02-27 10:35:231099parcourir


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")
  • Récupérer le nom de la classe

Class cls = ...// 1.获取完整类型(包括包名)String className = cls.getName();
// 2.获取简单类名 String simpleClassName =cls.getSimpleName();
  • 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);
  • Obtenez les informations sur le forfait de la classe

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

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

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

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});
  • Obtenir le paramètre d'entrée du constructeur tapez

Constructor constructor = ...
// 因为构造函数的入参有多个,因此返回的数组Class [] paramterTypes = constructor.getParameterTypes();
for(Class paramterType: paramterTypes ){    
// do something...}
  • 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"});

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();
  • Obtenir la variable spécifiée (publique, non publique)

Class cls = ...//入参为变量名称,名称不匹配则抛出异常// 获取指定公共变量Field field = cls.getField("num");
// 获取指定非公共变量Field privateField = cls.getDeclaredField("str");
  • 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);

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();
  • 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});
  • Récupérer le type de paramètre de la méthode

Method method = ...// 1.获取方法的所有入参类型Class [] paramterTypes = method.getParameterTypes();
// 2.获取方法的返回值类型Class reeturnType = method.getReturnType();
  • 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");
  • 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;
}

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;
  • Obtenir le type de membre du tableau

Class arrayCls = ...
Class arrayComponentType =arrayCls .getComponentType();
  • 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;");
  • 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));
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) !



Déclaration:
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