反射

来源:互联网 发布:哈萨克bayge软件下载 编辑:程序博客网 时间:2024/05/22 16:39

java反射:

      1) 反射是Java自我管理(类, 对象)的机制

      2) 可以通过反射机制发现对象的类型 发现类型的方法/属性/构造器

      3) Java 反射 可以创建对象并访问任意对象方法和属性等

类 Class<T>   java.lang.Object   java.lang.Class<T>

         类型参数:
         T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。

         如果将被建模的类未知,则使用 Class<?>。
      int a;
      Person p;
      类型    变量;
      类的类型            class对象
      Class<Person> type = Person.class;
 
    创建对象的时候:
    a Person p = new Person();
利用反射来创建对象(3种,前两种必须知道)
 
1 第1种   
  1)先创建class对象  
         Class<?> type = Person.class;//创建Class对象type
  2)type.newInstance():通过type来创建Preson对象
         Person person2 = (Person)type.newInstance();
         System.out.println("通过反射来创建Person对象"+person2);
2 第2种:根据类的包名.类名来创建class对象
      Class<?> type2 = Class.forName("ref1.Person");
      Person person3 = (Person) type2.newInstance();
      System.out.println(person3);
3 第3种:对象名.getClass()也可以获得class对象
      Class<?> type3 = person.getClass();
      Person person4 = (Person) type3.newInstance();
      System.out.println(person4);
 
2 Class 加载
     类加载到内存: java 将磁盘类文件加载到内存中,为一个对象(实例)这个对象是Class的实例,也就是 这些对象都是

     Class实例每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类。


Java程序中获得Class对象通常有如下三种方式:

     1).使用Class类的forName()静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整的包名)
     2).调用某个类的class属性来获取该类对应的Class对象。例如Person.class将会返回Person类对应的Class对象。

     3).调用某个类的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象
    
   对于第一种方式和第二种方式都是直接根据类来取得该类的Class对象,但相比之下,第二种方式有如下两种优势:

       (1).代码更安全,程序在编译阶段就可以检查需要访问的Class对象是否存在。
       (2).程序性能更高,因为这种方式无须调用方法,所以性能更好。

       大部分时候我们应该使用第二种方式,但是如果我们只有一个字符串,如"java.lang.String",如果需要获取该字符串对应的Class对象,则只能使用第一种方式了,例如我们在jdbc中调用数据库驱动的字符串


四个方法用于访问Class对应的类所包含的构造器:

1).Connstructor<T>  getConstructor(Class<?>...parameterTypes):返回此Class对象所表示的类的指定的public 构造器
2).Constructor<?>[]  getConstructors():返回此Class对象所表示的类的所有public构造器。
3).Constructor<T>  getDeclaredConstructor(Class<?>...ParameterTypes):返回此Class对象所表示的类的指定构造器,与构造器的访问级别无关。
4).Constructor<?>[] getDeclaredConstructors():返回此Class对象所表示的所有构造器,与构造器的访问级别无关


四个方法用于访问Class对应的类所包含的方法:
1).Method  getMethod(String name,Class<?>...parmeterTypes):返回此Class对象所表示的类的指定的指定的public 方法
2).Method[]  getMethod():返回此Class对象所表示的类的所有public 方法。
3).Method  getDeclaredMethods(String name,Class<?>...parameterTypes):返回此Class对象所表示的类的指定方法,与方法的访问级别无关。
4).Method[]  getDeclaredMethods():返回此Class对象所表示的类的全部方法,与方法的访问级别无关。


如下四个方法用于访问Class对应的类所包含的属性(Field):
1).Field  getField(String name):返回此Class对象所表示的类的指定的public属性(Field)。
2).Field[]  getFields():返回此Class对象所表示的类的所有public属性(Field)。
3).Field  getDeclaredFields(String name):返回此Class所表示的类的指定属性(Field),与属性的访问级别无关。
4).Field[]  getDeclaredFields(String name):返回此Class所表示的类的全部属性(Field),与属性的访问级别无关。



如下三个方法用于访问Class对应的类上所包含的注释:
1).<A  extends  Annotation>  A getAnnotation(Class<A> annotationClass):试图获取该Class对象所表示类上指定类型的注释;如果该类型的注释不存在则返回null.
2).Annotation[]  getAnnotations():返回此元素上存在的所有注释。
3).Annotation[]  getDeclaredAnnotations():返回直接存在于此元素上的所有注释。




使用反射生成并操作对象:
    Class对象可以获得该类里的成分包括方法(由Method对象表示),构造器(由Constructor对象表示),Field(由Field对象表示),这三个类都定义在java.lang.reflect包下,并实现了java.lang.reflect.Member接口,程序可以通过Method对象来执行对应的方法,通过Constructor对象来调用对应的构造器创建对象,能通过Field对象直接访问并修改对象的属性值。

0 0