【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就是一个有一点点实用意义的例子
补充:在实际开发的过程中,很少或几乎不会直接用到反射机制。只是在使用JavaBean、Struts、DAO等设计模式和框架的时候
作为程序员,应该知道在底层会基于反射机制自动的加载新的数据类型,解析这个类的类型结构,访问和操纵里边的成员
而且通过反射的方式进行编程,它的效率要低于非反射的方式。因此除非必须,通常不建议在开发中使用反射机制
Reflection API
Class:java.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对象对应的是数组,则该方法返回数组中元素的数据类型
- 【JavaSE入门系列】第20章_反射
- 【JavaSE入门系列】第00章_序
- 【JavaSE入门系列】第02章_面向对象程序设计
- 【JavaSE入门系列】第05章_数组
- 【JavaSE入门系列】第07章_高级类特性
- 【JavaSE入门系列】第08章_异常处理
- 【JavaSE入门系列】第10章_控制台应用程序设计
- 【JavaSE入门系列】第19章_应用程序国际化
- 【JavaSE入门系列】第21章_浅述Log4J
- 【JavaSE入门系列】第04章_运算符表达式流程控制
- 【JavaSE入门系列】第06章_面向对象编程进阶
- 【JavaSE入门系列】第09章_精通常用的Java类
- 【JavaSE入门系列】第09章_精通常用的Java类
- 【JavaSE入门系列】第01章_Java技术入门
- 【JavaSE入门系列】第03章_Java基础语法
- 【JavaSE入门系列】第18章_JDBC编程
- 【Oracle入门系列】第00章_序
- 【Oracle入门系列】第01章_数据库基础
- HTTP状态码
- JavaScript世界的一等公民 - 函数
- 【JavaSE入门系列】第19章_应用程序国际化
- qemu裏不停的單步是不會更新畫面的
- UITextField 文本字段控件 -- IOS (解决键盘遮住View及密文設定的问题)(实例)
- 【JavaSE入门系列】第20章_反射
- BloomFilter应用与D-Lelft BloomFilter实现
- win7下安装eclipse,tomcat及配置
- linux中卸载jdk,一个简单问题整了一下午
- popwindow 常用方法
- Google Maps API Key证书申请地址
- Beam search
- Jquery 详细介绍 元素附加
- Struts2 中的值栈的理解