Utilisation de la classe java.lang.Class

java.lang.Class est l'une des classes importantes en java mais rarement remarquée par les programmeurs java. Cette classe est très utile parce qu'elle possède plusieurs méthodes comme getClass(), forName() qui peuvent être utilisées pour charger une classe et vous pouvez aussi charger les pilotes Oracle et MySQL. La classe Class fournit aussi des méthodes comme Class.newInstance() qui permet de créer une instance d'une classe sans passer par l'opérateur new(). La classe java.lang.Class n'a aucun constructeur public et son instance est créée par la machine virtuelle JVM lors de son chargement. L'objet de la classe Class est aussi utilisé pour représenter les classes, les énumérations, les interfaces et les annotations dans une application java en cours d'exécution. Les types primitives byte, short, char, int, float, double et boolean sont représentés par les instances de java.lang.Class. Vous pouvez obtenir l'instance Class correspondante de cette manière: int.class, float.class ou boolean.class. Cette classe est aussi utilisée pour représenter l'instance d'un tableau en java. Chaque tableau avec le même  type et la même dimension partage la même instance de la classe Class. Une autre utilisation de la classe java.lang.Class, au moment de l'implémentation de la méthode equals() pour vérifier si deux objets sont du même type ou pas.

L'objet java.lang.Class est créé à chaque fois par la JVM qui décrit le type de l'objet. Toutes les instances de la même classe partagent le même objet Class et vous pouvez obtenir l'objet Class en appelant la méthode getClass(). Cette méthode est héritée de la classe java.lang.Object.

Supposons dans cet exemple qu'on a créé des instances différentes pour les comparer à la suite:

public static void main(String[] args) {

String str1 = new String(), str2 = new String();
System.out.println(str1.getClass().getName());
System.out.println(str2.getClass().getName());

if(str1.getClass().equals(str2.getClass())){
System.out.println("str1 and str2 sont des instances de la meme classe");
}else{
System.out.println("str1 and str2 sont des instances de classes différentes");
}

Integer A = new Integer(1);
Boolean B = new Boolean(true);
System.out.println(A.getClass().getName());
System.out.println(B.getClass().getName());

if(A.getClass().equals( B.getClass())){
System.out.println("A and B sont des instances de la meme classe");
}else{
System.out.println("A and B sont des instances de classes différentes");
}
}
Exécution:

java.lang.String
java.lang.String
str1 and str2 sont des instances de la meme classe
java.lang.Integer
java.lang.Boolean
A and B sont des instances de classes différentes
On a besoin des méthodes newInstance() et forName() parce que parfois, on ne peut pas connaitre le nom de la classe instanciée lors de l'exécution, donc ces méthodes nous rendent les choses plus simples.

try {
/*newInstance() équivalent à new String()*/
String str2 = str1.getClass().newInstance();
System.out.println(str2.getClass().getName());
System.out.println(str2.getClass().getSimpleName());
System.out.println(str2.getClass().getCanonicalName());

} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Exécution:

java.lang.String
String
java.lang.String
Il existe d'autres méthodes aussi pour tester le type de la classe:
isEnum(): renvoie true si le type est une énumération.
isArray(): renvoie true si le type est un tableau.
isInstance(Object o): renvoie true si une classe est une instance de l'objet o.
isLocal(): renvoie true si la classe est déclarée localement.

String str1 = new String();
String[] array = {"aa","bb","cc"};
String[] array2 = {"fd","be","ce"};
System.out.println(array.getClass().isArray()); //true
System.out.println(array.getClass().isInstance(array2)); //true
System.out.println(array.getClass().isLocalClass()); //false

Obtenir les constructeurs, les interfaces et les méthodes d'une classe

Un autre avantage de l'utilisation de java.lang.Class est qu'on peut afficher toutes les listes des constructeurs, attributs, méthodes et interfaces à l'aide des méthodes suivantes:

java.lang.Class.getConstructors(): retourne un tableau contenant tous les objets Constructor relatifs aux constructeurs public de la classe. Un tableau de taille 0 est retourné si la classe n'a aucun constructeur public, ou si la classe est une classe array.

java.lang.Class.getMethods()retourne un tableau contenant toutes les méthodes membres de la classe ou interface y compris ceux déclarées dans la classe ou l'interface ou ceux héritées d'une classe mère et interfaces mères. Un tableau de taille 0 est retourné si la classe n'a aucune méthode public, ou si la classe est une classe array.

java.lang.Class.getInterfaces(): cette méthode détermine les interfaces implémentées par une classe ou représentées par cet objet. Elle renvoie un tableau contenant toutes les interfaces de la classe y compris celles déclarées dans la classe ou celles héritées d'une classe mère. Un tableau de taille 0 est retourné si la classe n'a aucune interface public, ou si la classe est une classe array.

L'utilisation de ces trois méthodes est facile, comme montré dans le code suivant:

java.lang.Class button = Class.class.forName("javax.swing.JButton");

System.out.println("Constructeurs de "+button.getClass());
Constructor<?>[] c = button.getClass().getConstructors();
for(int i=0;i<c.length;i++)
System.out.println(c[i]);

System.out.println("Interfaces de "+button.getClass());
java.lang.Class<?>[] interfaces = button.getClass().getInterfaces();
for(int i=0;i<interfaces.length;i++)
System.out.println(interfaces[i]);

System.out.println("Méthodes de "+button.getClass());
Method[] m = button.getClass().getMethods();
for(int i=0;i<m.length;i++)
System.out.println(m[i]);
L'exécution de ce morceau de code donne une liste longue de méthodes de la classe java.lang.String, donc on va afficher juste la liste des constructeurs et des interfaces:

Constructeurs de javax.swing.JButton

Interfaces de javax.swing.JButton
interface java.io.Serializable
interface java.lang.reflect.GenericDeclaration
interface java.lang.reflect.Type
interface java.lang.reflect.AnnotatedElement

Méthodes de class javax.swing.JButton
public static java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader) throws java.lang.ClassNotFoundException
public static java.lang.Class java.lang.Class.forName(java.lang.String) throws java.lang.ClassNotFoundException
public native boolean java.lang.Class.isAssignableFrom(java.lang.Class)
public native java.lang.Class java.lang.Class.getSuperclass()
public native java.lang.Class java.lang.Class.getComponentType()
public java.lang.String java.lang.Class.toString()
public native boolean java.lang.Class.isInstance(java.lang.Object)
public native int java.lang.Class.getModifiers()
public native boolean java.lang.Class.isInterface()
public native boolean java.lang.Class.isArray()
public native boolean java.lang.Class.isPrimitive()
public java.lang.String java.lang.Class.getName()
public java.lang.Class java.lang.Class.asSubclass(java.lang.Class)
public java.lang.Object java.lang.Class.cast(java.lang.Object)
public java.lang.Class[] java.lang.Class.getClasses()
public java.lang.reflect.Field java.lang.Class.getField(java.lang.String) throws java.lang.NoSuchFieldException,java.lang.SecurityException
public java.lang.reflect.Field[] java.lang.Class.getFields() throws java.lang.SecurityException
public java.lang.reflect.Method java.lang.Class.getMethod(java.lang.String,java.lang.Class[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Method[] java.lang.Class.getMethods() throws java.lang.SecurityException
public java.lang.Package java.lang.Class.getPackage()
public java.net.URL java.lang.Class.getResource(java.lang.String)
public native java.lang.Object[] java.lang.Class.getSigners()
public boolean java.lang.Class.isAnnotation()
public boolean java.lang.Class.isEnum()
public boolean java.lang.Class.isLocalClass()
public boolean java.lang.Class.isSynthetic()
public java.lang.Object java.lang.Class.newInstance() throws java.lang.InstantiationException,java.lang.IllegalAccessException
public boolean java.lang.Class.desiredAssertionStatus()
public java.lang.annotation.Annotation java.lang.Class.getAnnotation(java.lang.Class)
public java.lang.annotation.Annotation[] java.lang.Class.getAnnotations()
public java.lang.String java.lang.Class.getCanonicalName()
public java.lang.ClassLoader java.lang.Class.getClassLoader()
public java.lang.reflect.Constructor java.lang.Class.getConstructor(java.lang.Class[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Constructor[] java.lang.Class.getConstructors() throws java.lang.SecurityException
public java.lang.annotation.Annotation[] java.lang.Class.getDeclaredAnnotations()
public java.lang.Class[] java.lang.Class.getDeclaredClasses() throws java.lang.SecurityException
public java.lang.reflect.Constructor java.lang.Class.getDeclaredConstructor(java.lang.Class[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Constructor[] java.lang.Class.getDeclaredConstructors() throws java.lang.SecurityException
public java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String) throws java.lang.NoSuchFieldException,java.lang.SecurityException
public java.lang.reflect.Field[] java.lang.Class.getDeclaredFields() throws java.lang.SecurityException
public java.lang.reflect.Method java.lang.Class.getDeclaredMethod(java.lang.String,java.lang.Class[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Method[] java.lang.Class.getDeclaredMethods() throws java.lang.SecurityException
public native java.lang.Class java.lang.Class.getDeclaringClass()
public java.lang.Class java.lang.Class.getEnclosingClass()
public java.lang.reflect.Constructor java.lang.Class.getEnclosingConstructor()
public java.lang.reflect.Method java.lang.Class.getEnclosingMethod()
public java.lang.Object[] java.lang.Class.getEnumConstants()
public java.lang.reflect.Type[] java.lang.Class.getGenericInterfaces()
public java.lang.reflect.Type java.lang.Class.getGenericSuperclass()
public native java.lang.Class[] java.lang.Class.getInterfaces()
public java.security.ProtectionDomain java.lang.Class.getProtectionDomain()
public java.io.InputStream java.lang.Class.getResourceAsStream(java.lang.String)
public java.lang.String java.lang.Class.getSimpleName()
public java.lang.reflect.TypeVariable[] java.lang.Class.getTypeParameters()
public boolean java.lang.Class.isAnnotationPresent(java.lang.Class)
public boolean java.lang.Class.isAnonymousClass()
public boolean java.lang.Class.isMemberClass()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
Références:
Javadoc: java.lang.Class