【JavaSE入门系列】第20章_反射

来源:互联网 发布:英语四级备考软件 编辑:程序博客网 时间:2024/05/29 11:05

第20章反射——v512工作室   编辑:玄玉


Reflection  APIjava.lang.reflect.Array获取Class对象java.lang.reflect.Fieldjava.lang.reflect.Modifier我的博客java.lang.reflect.Methodjava.lang.reflect.Constructorv512工作室

反射机制(Reflection)
概述:Java程序在运行期间可以动态加载解析使用在编译阶段并不确定的类型,这一机制被称为内省(Introspection)或反射
              反射是让程序自己去解析并获取新遇到的类型,随即操纵它。这一点与过去的编程方式有所不同
              过去都是在源代码中明确所要使用的数据包括变量、方法及其数据类型,然后才能去访问或调用
功能:可以操作该类型或其实例,包括访问属性调用方法创建新对象。只不过其方式与过去的用法有很大的差别
              而且是在加载运行时才能确定的数据类型。也可以解析类的结构获取其内部信息
说明:有时在程序中才能确定一个数据类型以及它的方法名。如果不使用反射API,就无法创建该类型的对象,也不能调用它的方法
              实际上在Web编程中或后期使用的各种JavaBean,还有DAO数据设计模式,以及Hibernate中操纵数据时的一些Java类等等
              其实在它们的底层中都涉及到了反射机制。例如本教程源代码中的TestReflection05就是一个有一点点实用意义的例子
补充:在实际开发的过程中,很少几乎不会直接用到反射机制。只是在使用JavaBeanStrutsDAO等设计模式和框架的时候
              作为程序员,应该知道在底层会基于反射机制自动的加载新的数据类型,解析这个类的类型结构,访问和操纵里边的成员
              而且通过反射的方式进行编程,它的效率要低于非反射的方式。因此除非必须通常不建议在开发中使用反射机制

 

 

 

Reflection  API
  Classjava.lang.Class类。Class类的实例用于表示运行时的Java数据类型
                包括类、接口、数组、枚举、注解和基本数据类型。还包括一种特殊的Java数据类型,即void
                在类加载时,Java虚拟机会自动创建相应Class对象
API包java.lang.reflect包。相对来说常用的有如下几种,这些就是Java反射API的主要组成部分
                 java.lang.reflect.Field——————描述Java类中的成员的属性,也叫做成员变量
               java.lang.reflect.Method—————描述Java类中的方法,包括静态方法普通的成员方法
               java.lang.reflect.Constructor———描述构造方法
              java.lang.reflect.Modifier—————描述标识符
              java.lang.reflect.Array——————动态创建和访问Java数组。是一个专门提供的数组操作工具
说明:面向对象的编程思想允许用户定义新的数据类型,描述所要研究或处理的信息
              实际上每一个Class对象可以认为它对应了一种Java数据类型,包括引用类型和基本数据类型
续一:在一个Java源文件中可能会引入多个包,有时为了方便,直接写成了诸如import java.util.*的形式
              此时可以在Eclipse中打开源文件,在文件中右键—→Source—→Organize Imports能够显示所使用的包中的具体的类名

 

 

 

获取Class对象
引用:针对引用数据类型,有三种方式,如下
              1)调用静态方法Class.forName()
                    Class.forName("p1.Person");
                    Class.forName("oracle.jdbc.driver.OracleDriver");
              2)调用Object类中定义的getClass()方法
                    Person p=new Person();
                    Class c1=p.getClass();
                    Class c2="HelloWorld".getClass();
              3)使用.class表达式
                    Class c1=String.class;
                    Class c2=p1.Person.class;
                    Class c3=oracle.jdbc.driver.OracleDriver.class;
说明:第一种方式不可以省略包层次,因为在编译器眼中,那只是一个字符串,它并不检查是否真的存在包和类
              第三种方式中可以省略包层次,因为在编译阶段就会识别相应的类名,它会在引入的包中查找相应的类
              其实.class表达式即不是方法,也不是属性,只是一个约定的表达式而已
基本:针对基本数据类型及void,有两种方式,如下
              1)使用.class表达式
                    Class c1=int.class;———这只是一种约定的标记,并不是说int类型封装了class属性
                    Class c2=double.class;
                    Class c3=void.class;
              2)调用相应封装类的.Type属性
                    Class c1=Integer.TYPE;———返回的Class对象对应的是int类型,而不是Integer类型。二者实际上是有差别
                    Class c2=Double.TYPE;
                    Class c3=Void.TYPE;

 

 

 

java.lang.reflect.Field
获取Field对象:由Class类提供
          public Field[] getDeclaredFields()    //返回当前类层次中声明的所有属性。无论访问控制权限是什么,统统都会返回,但不包括父类层次中声明的属性
          public Field getDeclaredField(String name)  //返回当前类层次中声明的特定属性。无论访问控制权限是哪一种,返回的也是一个单数Field对象
          public Field[] getFields()                                    //返回当前类所有层次(包括当前类层次和其父类层次)中声明的所有public属性
          public Field getField(String name)               //返回当前类中特定的某一个属性,必须是public的。也可以是父类中的
Field类主要成员方法
          public Object get(Object obj)                          //获取指定对象的属性值
          public void set(Object obj,Object value)   //设定对象的属性值为指定的值
          public xxx getXxx(Object obj)                     //获取某一个对象的属性值
          public void setXxx(Object obj,XXX x)    //设定某一个对象的属性为指定的值
          public String getName()                             //返回当前的属性名
          public int getModifiers()                           //返回当前属性的修饰符。这里返回的是修饰符的模式数值
          public <T extends Annotation> T getAnnotation(Class<T> annotationClass)    //返回当前或者说这个属性前面的注解,若没有,则返回null
          public String toString()                          //被重写。以字符串形式返回当前属性的完整的格式。包括它的修饰符,类型名字,初值,注解等信息
          public boolean equals(Object obj)   //被重写。比较当前Field对象与另一个Field对象是否等价。只要类型和名字相同,则认为等价

 

 

 

java.lang.reflect.Method
获取Method对象:由Class类提供
          public Method[] getDeclaredMethods()         //获取当前类层次中声明的所有方法,不包括父类中的,不限制访问控制权限
          public Method getDeclaredMethod(String name,Class<?>... parameterTypes)  //返回当前类层次中声明的某一个特定的方法
                                                                                                                                                               //name是方法名,形参采用的是泛型机制和可变参数
          public Method[] getMethods()                                                                                         //访问当前类所有层次(包括父类中)定义过的public的方法
          public Method getMethod(String name,Class<?>... parameterTypes)              //这是访问特定的方法
Method主要成员方法
          public Object invoke(Object obj,Object... args)
          public String getName()                                              //返回方法名
          public Class<?>[] getParameterTypes()               //返回参数列表
          public int getModifiers()                                         //返回修饰符
          public Class<?> getReturnType()                      //返回当前方法的返回值类型
          public Class<?>[] getExceptionTypes()         //返回当前方法声明抛出异常类型
          public <T extends Annotation> T getAnnotation(Class<T> annotationClass)   //获取当前方法的可能存在的注解
          public String toString()  和  public boolean equals(Object obj)                             //仍然是重写toString()和equals()方法

 

 

 

java.lang.reflect.Modifier
Class提供的方法public int getModifiers()                                     //获取Modifier对象
Modifier类的方法public static boolean isPublic(int mod)       //解析模式值是否包含某一种修饰符
                                       public static boolean isPrivate(int mod)    //因为模式值也可能以组合的形式出现
                                       public static boolean isProtected(int mod)
                                       public static boolean isAbstract(int mod)
                                       public static boolean isFinal(int mod)
                                       public static boolean isStatic(int mod)
                                       ......
                                       public static String toString(int mod)    //将指定的模式数值转换成相应的字符串

 

 

 

java.lang.reflect.Constructor
获取Constructor对象:由Class类提供
          public Constructor<?>[] getDeclaredConstructors()
          public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
          public Constructor<?>[] getConstructors()
          public Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor主要成员方法
          public T newInstance(Object... initargs)    //创建一个新对象
          public String getName()
          public Class<?>[] getParameterTypes()
          public int getModifiers()
          public Class<?>[] getExceptionTypes()
          public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
          public String toString()
          public boolean equals(Object obj)

 

 

 

java.lang.reflect.Array
功能:动态创建和访问Java数组
方法public static int getLength(Object array)        //返回指定数组对象的长度
public static Object get(Object array,int index)        //返回指定数组中指定下标处元素的值,返回值是Object类型
public static xxx getXxx(Object array,int index)     //返回指定数组中指定下标处元素的值,且该元素值会被自动解析成某一种基本的数据类型
public static void set(Object array,int index,Object value)    //设置指定数组中的下标处元素的值为指定的值
public static void setXxx(Object array,int index,xxx z)         //设置指定数组中的下标处元素的值为指定的基本数据类型的值
public static Object newInstance(Class<?> componentType,int length)                 //创建一个新的一维数组
public static Object newInstance(Class<?> componentType,int... dimensions)  //创建一个新的多维数组
Class类提供的方法public Class<?> getComponentType()     //若当前Class对象对应的是数组,则该方法返回数组中元素的数据类型

原创粉丝点击