Cerca de 8 mil palabras que reflejan las mercancías secas | [] java avanzada, java reflexión sucinta

java mecanismo de reflexión de manera sucinta

Contenidos
Conceptos mecanismo de reflexión
clase base 2. Clase refleja
3. El uso de reflejada
Ejemplo de aplicación 4. refleja

Sobre el autor: notas completas pila estudio, la gente está trabajando en un
número público de micro-canales: Día Pública N ° día más maravilloso Ensayo empuje
Aquí Insertar imagen Descripción

El concepto de reflexión:

En el estado operativo, para cualquier clase, puede obtener todas las propiedades y métodos de este tipo, para cualquier objeto que puede invocar cualquiera de sus métodos y propiedades (incluyendo métodos y propiedades de propiedad), que de forma dinámica adquiere información de la función y el método de invocación dinámica de objeto se llama un lenguaje java reflexión. Reflexiones son vistos como clave para lenguajes dinámicos. Reflexión es simplemente asigna a los diversos componentes de la correspondiente java clase Java.

jerga popular, por la reflexión, la clase es completamente transparente para nosotros, usted desea conseguir cualquier cosa puede ser. El método comprende la construcción, propiedades, métodos.

mecanismo de reflexión de Java proporciona una funcionalidad :

El análisis de la clase de tiempo de ejecución de una cualquiera objeto pertenece;
objeto constructor cualquier clase en tiempo de ejecución;
variables miembro análisis y métodos de cualquier clase tiene en tiempo de ejecución;
llamando al método de un objeto especificado en tiempo de ejecución;
generan proxy dinámico.

De hecho, esto también está relacionado con la dinámica y estática lenguaje, el lenguaje Java en sí no es un lenguaje dinámico, pero tiene un mecanismo dinámico muy prominente, lo que llamamos la reflexión.
¿Qué es un lenguaje dinámico? Es decir, cuando el programa se está ejecutando, (nota que es el momento de correr, no el tiempo de compilación) permite cambiar la estructura del programa o de tipo variable. Por el contrario estática hay tal personalidad.

Clase refleja clase base

clase clase es la base de la reflexión de conseguir, así que quiero aprender a la reflexión, debe dominar primero los conceptos básicos de la clase de la clase.
¿Qué clase es? clase de clase es una instancia de una clase de objeto, por lo que la clase clase es la clase de todas las clases.

Para Anatomía de una clase, primero debe llegar a la clase de objeto archivo de código de bytes. Clase es el método utilizado por la clase de anatomía, la primera para obtener el objeto de cada archivo de clase de tipo corresponde de código de bytes.

Clase pública constructor sin clase, clase de objeto clase se carga en el momento en que la máquina virtual Java y una automática de defineClass método de llamada configurados por el cargador de clases, no se declara explícitamente un objeto de la clase. Aquí también implica una carga de cosas, como

Explique brevemente:

cargador de clases: el momento en que el programa tiene que ser con una clase si ésta no ha sido cargado en la memoria, el sistema de carga de la conexión, esta clase de inicialización de inicialización tres pasos

Carga: se refiere al archivo de clase se lee en la memoria (archivo después de la compilación es .class archivo), y al que crear un objeto de la clase
cuando se utiliza cualquier clase, el sistema va a construir un objeto de clase, la primera vez será el segundo determinarán veces existe la clase.

Conexiones: Compruebe que tiene la estructura interna correcta, y otros tipos de coordinación y
listo para asignar memoria para el miembro estático de la clase, y establecer el valor de inicialización por defecto
y hacer una resolución: referencias de carácter de clase de datos binarios sustituye por una referencia directa.

Hablando por encima del objeto clase no se pueden crear directamente, pero podemos conseguir la clase Clase de otras maneras, hay tres maneras de conseguir la clase de clase que queremos, que normalmente puede utilizar la reflexión para obtener una clase después de clase.

Clase tres formas de adquirir (la obtención de un objeto de código de bytes de clases):

La primera: el uso de un acceso a objetos, el uso caen objetos getClass

Person person = new Person();
Class clazz = person.getClass();

El segundo: utilizar una propiedad de clase estática

Class clazz = Person.class

Tercero: método estático clase forName Clase (cadena de nombre de clase)
Nota; escribir el nombre completo del nombre del paquete de clases

Class clazz = Calss.forName("…….");

Pues bien, el enfoque aquí, lo que refleja cómo jugar sea divertido!

Uso reflejada ##

Se dice lo que se puede obtener a través de cualquiera de una clase de reflexión, vamos a ver si es verdad.

El primer paso para hacer ? Por supuesto, esto se puede obtener por la clase que agrada a tres métodos anteriores de la Clase. Hay tres métodos, primero tenemos que ser un ejemplo de ello!
el Código

//获取Class第一种方法
Student student = new Student();
Class clazz = student.getClass();
//获取Class第二种方法
Class clazzTwo = Student.class;
//获取Class第三种方法
Class clazzThree = Class.forName("demo.qzxxbj.entity.Student");

System.out.println("第一个"+clazz+"\n第二个"+clazzTwo+"\n第三个"+clazzThree);

resultado

第一个class demo.qzxxbj.entity.Student
第二个class demo.qzxxbj.entity.Student
第三个class demo.qzxxbj.entity.Student

Clase de objeto se puede ver tres métodos son los mismos, no hay diferencia.
El tercer método es una clase que no se encuentra una excepción será lanzada.
Estudiante de las cuales es una clase simple puede ser cualquier clase.

Obtener la propiedad por cualquier clase de Clase
clase códigos Estudiante

package demo.qzxxbj.entity;

/**
 * @author 微信公众号:全栈学习笔记
 * @date 2020/3/29
 * @description
 */

public class Student {
private String name;
private Integer age;
private String sex;
public int number;

public int getNumber() {
    return number;
}

public void setNumber(int number) {
    this.number = number;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

public String getSex() {
    return sex;
}

public void setSex(String sex) {
    this.sex = sex;
}

}

Los siguientes métodos se utilizan para obtener la clase A segundo, más concisa

	//获取Class第二种方法
    Class clazzTwo = Student.class;

    //获取该类指定属性名的public成员变量,包括父类的
    Field field = clazzTwo.getField("number");

    //field   public int demo.qzxxbj.entity.Student.number
    System.out.println("该类指定属性名的public成员变量,包括父类的"+field);

    //获取该类指定名称声明的变量,即不包括父类的
    Field deField = clazzTwo.getDeclaredField("name");

    // deField  private java.lang.String demo.qzxxbj.entity.Student.name
    System.out.println("该类所有声明的变量,即不包括父类的"+deField);

    //获取该类所有的public声明的成员变量
    Field fields[] = clazzTwo.getFields();

    System.out.println("public声明的变量:");
    //public int demo.qzxxbj.entity.Student.number
    for (Field field1:fields){
        System.out.println(field1);
    }

    //获取该对象的所有成员变量
    Field deFields[] = clazzTwo.getDeclaredFields();
    System.out.println("该对象的所有成员变量");
    //private java.lang.String demo.qzxxbj.entity.Student.name
    //private java.lang.Integer demo.qzxxbj.entity.Student.age
    //private java.lang.String demo.qzxxbj.entity.Student.sex
    //public int demo.qzxxbj.entity.Student.number
    for (Field field1:deFields){
        System.out.println(field1);
    }

Recuerde getFields (), getField (String name), getDeclaredFields (), la diferencia getDeclaredField (String name), usted será capaz de tomar este conocimiento para comprender el punto!

Adquisición por cualquier miembro de la clase método

O para ver el código!

La adquisición de método miembro Método

	//获取Class第二种方法
    Class clazzTwo = Student.class;
    //根据方法名以及参数类型获取,只能获取public声明的方法,包括父类的
    Method method = clazzTwo.getMethod("setAge",Integer.class);

    //public java.lang.Integer demo.qzxxbj.entity.Student.getAge()
    System.out.println(method);

    //根据方法名以及参数名称获取该类声明的所有的属性方法,不包括父类的
    Method deMethod = clazzTwo.getDeclaredMethod("setAge", Integer.class);

    System.out.println(deMethod);

    //获取该对象声明的所有的public方法,包括父类的
    Method methods[] = clazzTwo.getMethods();

    //获取该对象声明的所有的方法,但是不包含父类的方法
    Method deMethods[] = clazzTwo.getDeclaredMethods();

Qué manera de imprimir el Método es? También se incluye el código anterior

public void demo.qzxxbj.entity.Student.setAge(java.lang.Integer)

Y hablar ante El campo no es muy similar.
Ahora viene el método, entonces ciertamente implica una llamada a un método , obtenemos estos métodos, ¿cómo debería llamar a esta clase que manera de hacer eso? Utilice la función de invocación, la clase que contiene el método invocar una función, bueno saber Inglés, esta invocación de los medios chinos "para llamar."
Cómo se usa?

    //获取Class第二种方法
    Class clazzTwo = Student.class;
    //根据方法名以及参数类型获取,只能获取public声明的方法,包括父类的
    Method method = clazzTwo.getMethod("setAge",Integer.class);

    //public java.lang.Integer demo.qzxxbj.entity.Student.getAge()
    System.out.println(method);

    //利用Class创建一个对象的实例
    Student student = (Student) clazzTwo.newInstance();

    //函数调用
    Object value = method.invoke(student,20);
    //null
    System.out.println(value);

El código anterior, no puede entender, que estoy hablando, en primer lugar, se obtiene una clase de clase, y entonces tenemos este tipo de un método por el setAge esta clase, continué a llamar a este método después de la obtención de este método, llame al método ¿no debería ser llamado una instancia de un objeto dentro del método? Por lo que necesitamos para crear instancias de un objeto, por lo que los métodos, (), cree una instancia de la clase a través del interior de la newInstance, este método requiere la instancia de la clase tiene un constructor sin parámetros. Hay otros métodos para crear una instancia, diríamos más tarde. Después de crear una instancia de un objeto, podemos empezar a llamar al método.
Por el llamado método de invocación, invoque el primer parámetro es una instancia de un objeto, o voy a buscar este método. El segundo argumento, o de un tercero, y así sucesivamente, que todos los parámetros están detrás de mí llamada tiene parámetros, de acuerdo con ir el fin de llenar OK. A continuación, la función devuelve un objeto del objeto, se puede pensar, que yo llamo un método no es para obligarle a hacer algo, para hacer estas cosas tienen que volver una cosa, no sé qué es esto, a su uso Object Obtiene cosa. Debido a que estamos llamando a este método no requiere el valor de retorno, por lo que la hipótesis nula. No es sencillo.

Obtener constructor de la clase de

Este soy yo en el pasado para aprender, después de todo, creo que el uso de la proporción relativamente pequeña. Juntos para aprender acerca de cómo obtener el método de construcción con la clase, y le llaman.

public Student(String name, int id) {
    this.name = name;
    this.id = id;
}

Aquí estamos en la clase Estudiante que añade un constructor.

Entonces conseguimos al constructor.

	//获取Class第二种方法
    Class clazzTwo = Student.class;

    //获取无参构造方法,public声明的,包括父类,加上参数时就是获取特定的构造方法
    Constructor constructor = clazzTwo.getConstructor();

    //public demo.qzxxbj.entity.Student()
    System.out.println(constructor);

    //获取该类所有的public声明的构造方法
    Constructor constructors[] = clazzTwo.getConstructors();

    //获取指定参数的构造方法
    Constructor deConstructor = clazzTwo.getDeclaredConstructor(String.class,Integer.class);

    //获取所有的该类的构造方法,不包括父类的
    Constructor deConstructors[] =clazzTwo.getDeclaredConstructors();

El código anterior debe ser fácil de entender, y no voy a dar más detalles. Aquí para hablar de cómo utilizar el constructor obtenido, por definición, es el constructor para crear un objeto, lo anterior tenemos cuando se trata de cómo crear una instancia de un objeto a través de la clase, vamos a crear un objeto mediante la construcción método del cuadrado

	Student student = (Student) deConstructor.newInstance("全栈学习笔记",21);

    //21
    System.out.println(student.getAge());

Ahora lo saben, no estamos mal reflejo de la función terminó, se envió un reflejo del proxy dinámico, esto es más importante, un blog será una palabra de código especial no es fácil. Quiero señalar seguidores. Microcanal número público: notas completas pila estudio, Ensayo maravillosa empuje día para usted.

Finalmente escribí una declaración java sql costura reflejo de mi propia experiencia previa, el equivalente es la aplicación de un reflejo de la misma.

Ejemplo de aplicación refleja

Por la reflexión a la declaración SQL generado dinámicamente, no es que se sienta un poco rápido de hardware?
Directamente sobre el código, y yo sólo hice una instrucción SQL, y una carta privada interesada Me parece que puedo conseguir el código completo!

public  String insert(Object object) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {`
    //insert into student(id,name,sex) values (1,"全栈学习笔记","男")
    StringBuilder sql = new StringBuilder();
    Class clazz = object.getClass();
    sql.append("insert into ");

    sql.append(clazz.getSimpleName()+"(");
    Field[] fields = clazz.getDeclaredFields();
    for(Field field:fields){
        sql.append(field.getName()+",");
    }
    sql.deleteCharAt(sql.length()-1);
    sql.append(")");
    sql.append(" values (");
    for(Field field:fields){
        field.setAccessible(true);
       Object value = field.get(object);

       String fieldName = field.getName();
       String str1 = fieldName.substring(0,1).toUpperCase();
       String str2 = fieldName.substring(1,fieldName.length());
       String strValue = str1.concat(str2);
		//String strValue = fieldName.substring(0,1).toUpperCase().concat(fieldName.substring(1,fieldName.length()));
       Method method = clazz.getMethod("get"+strValue,null);

       Object value1 = method.invoke(object,null);

//     if(value1.getClass().equals(String.class))
//     if(field.getType().equals(String.class))
        if(value1 instanceof String){
            sql.append("\"").append(value1).append("\"").append(",");
        }else {
            sql.append(value1).append(",");
        }
    }
    sql.deleteCharAt(sql.length()-1);
    sql.append(")");
    System.out.println(sql.toString());
    return sql.toString();
}

Este problema de explicar aquí, también debe hacer una copia de un artículo sobre las anotaciones, si usted encuentra el artículo en el lugar equivocado, por favor señalar a Oh! Si cree que puede aprender mucho conocimiento, hacer un punto de preocupación Oh! Bienvenido a enviar! Hacer más amigos aprenden!

Publicado siete artículos originales · ganado elogios 2 · Vistas 521

Supongo que te gusta

Origin blog.csdn.net/enxiaobai123/article/details/105193822
Recomendado
Clasificación