Questions d'entrevue - 15 réflexions

1. Utilisez le nouveau mot-clé

Il s'agit de la manière la plus courante et la plus simple de créer des objets. De cette façon, nous pouvons appeler n'importe quel constructeur (sans paramètres et avec paramètres).

2. Utilisez la méthode newInstance de la classe Class

Nous pouvons également utiliser la méthode newInstance de la classe Class pour créer des objets. La méthode newInstance appelle le constructeur sans paramètre pour créer l'objet.

3. Utilisez la méthode newInstance de la classe Constructor

Semblable à la méthode newInstance de la classe Class,
il existe également une méthode newInstance dans la classe java.lang.reflect.Constructor pour créer des objets.

4. Utilisez la méthode de clonage

Chaque fois que nous appelons la méthode clone d'un objet, jvm créera un nouvel objet et copiera tout le contenu de l'objet précédent. L'utilisation de la méthode clone pour créer un objet n'appelle aucun constructeur.

5. Utiliser la désérialisation

Lorsque nous sérialisons et désérialisons un objet, jvm créera un objet séparé pour nous. Lors de la désérialisation, jvm crée l'objet et n'appelle aucun constructeur.
Afin de désérialiser un objet, nous devons faire en sorte que notre classe implémente l'interface Serializable

Réflexion Java pour obtenir une méthode privée d'une classe

1. Obtenez la classe via class.forname ()
2. Obtenez l'objet cible Method method = clazz.getDeclaredMethod (name); // Toutes les méthodes de la classe peuvent être appelées (à l'exception des méthodes héritées de la classe parente) Method
method = clazz .getMethod (name); // Vous pouvez appeler des méthodes avec des droits d'accès dans la classe (y compris les méthodes héritées de la classe parente)
3. méthode.toGenericString () ou method.toString () pour afficher la forme de chaîne de la méthode
4 . Utilisez la méthode d'appel de méthode invoke ()

Insérez la description de l'image ici
Insérez la description de l'image ici

Processus de chargement de classe
Insérez la description de l'image ici
Insérez la description de l'image ici

Class<?> c1 = Class.forName("com.zyf.dao.User");
Field[] fields = c1.getFields();//获取public 修饰的属性
for (int i = 0; i < fields.length; i++) {
    
    
    System.out.println(fields[i]);
}
System.out.println("11111111111111");
fields = c1.getDeclaredFields();//获取所有属性
for (int i = 0; i < fields.length; i++) {
    
    
    System.out.println(fields[i]);
}

Method[] methods = c1.getMethods();//获取所有本类+父类的publc公开的方法
for (int i = 0; i < methods.length; i++) {
    
    
    System.out.println(methods[i]);
}
System.out.println("=============");
methods = c1.getDeclaredMethods();//获取本类中的所有方法
for (int i = 0; i < methods.length; i++) {
    
    
    System.out.println(methods[i]);
}

Insérez la description de l'image ici

//1.通过 Class.forName() 获取类
Class c1 = Class.forName("com.zyf.dao.User");
//2.通过newInstance()方法 获取具体的对象
Object user = c1.newInstance();
System.out.println(user);
//3.通过getDeclaredMethod 得到具体的方法
Method getName = c1.getDeclaredMethod("getName");
Method setName = c1.getDeclaredMethod("setName", String.class);
//4.通过invoke进行赋值和获取信息
setName.invoke(user,"zhangsan");
Object invoke = getName.invoke(user);
System.out.println(invoke);
System.out.println(user);
//5.通过getDeclaredConstructor(参数类型) 得到构造方法
Constructor<?> constructor = c1.getDeclaredConstructor(String.class, String.class);
//6.通过newInstance 得到对象 可以无参
Object s = constructor.newInstance("张飞", "11234");
//invoke(对象名,方法的参数值)
setName.invoke(s,"张云飞");
System.out.println(s);
//7.getDeclaredField获取属性
Field name = c1.getDeclaredField("name");//name属性是私有的 获取不到
//不能直接操作私有的属性,我们要关闭程序的安全监测,属性或者方法的setAccessible(true)
name.setAccessible(true);
name.set(s,"ppt");
System.out.println(s);
//8.getDeclaredMethod获取方法
Method setlalala = c1.getDeclaredMethod("setlalala", String.class);
//不能直接操作私有的属性,我们要关闭程序的安全监测,属性或者方法的setAccessible(true)
setlalala.setAccessible(true);
setlalala.invoke(s,"woshishui");
System.out.println(s);
 Field[] fields = c1.getFields();//获取public 修饰的属性
//        for (int i = 0; i < fields.length; i++) {
    
    
//            System.out.println(fields[i]);
//        }
//        System.out.println("11111111111111");
//        fields = c1.getDeclaredFields();//获取所有属性
//        for (int i = 0; i < fields.length; i++) {
    
    
//            System.out.println(fields[i]);
//        }
//
//        Method[] methods = c1.getMethods();//获取所有本类+父类的publc公开的方法
//        for (int i = 0; i < methods.length; i++) {
    
    
//            System.out.println(methods[i]);
//        }
//        System.out.println("=============");
//        methods = c1.getDeclaredMethods();//获取本类中的所有方法
//        for (int i = 0; i < methods.length; i++) {
    
    
//            System.out.println(methods[i]);
//        }

Insérez la description de l'image ici

La désactivation de la surveillance peut améliorer l'efficacité de l'exécution

Je suppose que tu aimes

Origine blog.csdn.net/zyf_fly66/article/details/114087047
conseillé
Classement