Preguntas de entrevista-15 reflexiones

1. Utilice la nueva palabra clave

Ésta es la forma más común y sencilla de crear objetos. De esta forma, podemos llamar a cualquier constructor (sin parámetros y con parámetros).

2. Utilice el método newInstance de la clase Class

También podemos usar el método newInstance de la clase Class para crear objetos. El método newInstance llama al constructor sin parámetros para crear el objeto.

3. Utilice el método newInstance de la clase Constructor

Similar al método newInstance de la clase Class,
también hay un método newInstance en la clase java.lang.reflect.Constructor para crear objetos.

4. Utilice el método de clonación

Siempre que llamemos al método clon de un objeto, jvm creará un nuevo objeto y copiará todo el contenido del objeto anterior. El uso del método clon para crear un objeto no llama a ningún constructor.

5. Utilice la deserialización

Cuando serializamos y deserializamos un objeto, jvm creará un objeto separado para nosotros. Al deserializar, jvm crea el objeto y no llama a ningún constructor.
Para deserializar un objeto, necesitamos hacer que nuestra clase implemente la interfaz serializable

Reflexión de Java para obtener un método privado de una clase

1. Obtenga la clase a través de class.forname ()
2. Obtenga el objeto de destino Method method = clazz.getDeclaredMethod (name); // Todos los métodos de la clase se pueden llamar (excepto los métodos heredados de la clase principal) Method
method = clazz .getMethod (name); // Puede llamar a métodos con permisos de acceso en la clase (incluidos los métodos heredados de la clase principal)
3. method.toGenericString () o método method.toString () para generar la forma de cadena del método
4 .Use el método de llamada al método invoke ()

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Proceso de carga de clases
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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]);
}

Inserte la descripción de la imagen aquí

//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]);
//        }

Inserte la descripción de la imagen aquí

Desactivar la supervisión puede mejorar la eficiencia de la ejecución

Supongo que te gusta

Origin blog.csdn.net/zyf_fly66/article/details/114087047
Recomendado
Clasificación