Cet article crée un objet de java.lang.Void
,
Il s'agit d'un article qui a tenté d'appeler la méthode de l'objet.
Cependant, créer un objet de java.lang.Void
n'a probablement aucun mérite, c'est donc juste un jeu.
J'ai également écrit un commentaire dans les commentaires.
import java.lang.reflect.Constructor;
public class CreateVoid {
public static void main(String... args) throws Exception {
//Comment obtenir une classe en spécifiant le nom de la classe sous forme de chaîne de caractères
Class<Void> voidClazz1 = (Class<Void>)Class.forName("java.lang.Void");
Void o1 = getVoid(voidClazz1);
//Comment obtenir la classe à partir de la méthode réelle
Class<Void> voidClazz2 = (Class<Void>)CreateVoid.class.getMethod("voidMethod", new Class[]{}).getReturnType();
Void o2 = getVoid(voidClazz2);
System.out.println(o1);//java.lang.Void@1c6b6478
//Puisque la méthode equals n'est pas remplacée, elle sera toujours fausse s'il s'agit d'une autre instance.
System.out.println(o1.equals(o2));//false
System.out.println(o1.hashCode());//476800120
System.out.println(o1.toString());//java.lang.Void@1c6b6478
System.out.println(o1.getClass());//class java.lang.Void
}
//S'il est nul, ce sera un type primitif, donc Void(=java.lang.Void)est.
public Void voidMethod(){return null;};
//Class<Void>Créer un objet Void à partir de
private static Void getVoid(Class<Void> voidClazz) throws Exception {
//Recherche dans la source JDK`private Void() {}`Et le constructeur est privé, vous devez donc effectuer les opérations suivantes
//1.Écrivez getDeclaredConstructor au lieu de getConstructor
//2.Définissez l'indicateur accessible sur true
Constructor<?> declaredConstructor = voidClazz.getDeclaredConstructor(new Class[]{});
declaredConstructor.setAccessible(true);
return (Void)declaredConstructor.newInstance(new Object[]{});
}
}
Recommended Posts