JavaSE阶段回顾(10)反射

反射

类对象:java.lang.Class
• Java反射机制允许程序在运行时通过Reflection APIs取得任何一个已知名称的class的内部信息,包括其修饰符、父类、接口、构造方法、属性、方法等,并可于运行时改变属性值或者调用方法等;
• Java反射机制是Java语言的一个重要特性,使得Java语言具备“动态性”:
• 在运行时获取任意一个对象所属的类的相关信息;
• 在运行时构造任意一个类的对象;
• 在运行时获取任意一个类所具有的成员变量和方法;
• 在运行时调用任意一个对象的方法;
JAVA反射机制是构建框架技术的基础所在,例如后续的Spring框架等,都使用到反射技术;
• Java的反射机制依靠反射API实现,反射API主要包括以下几个类:
• java.lang.Class类:代表一个类;
• java.lang.reflect.Field 类:类的成员变量(成员变量也称为类的属性);
• java.lang.reflect.Method类:类的方法;
• java.lang.reflect.Constructor 类:类的构造方法;
• java.lang.reflect.Array类:动态创建数组,以及访问数组的元素的静态方法;

Class

• java.lang.Class类是反射机制中最重要的类,是使用反射机制时的“起点”;
• JVM运行程序时,会将要使用到的类加载到内存中,同时就会自行为这个类创建一个Class对象,这个对象中就封装了类的所有信息,包括类中的属性、方法、构造方法、修饰符等;
• Java.lang.Class类中定义了一系列的getXXX方法,可以获取Class中封装的其他信息;
• Java.lang.Class类中定义了一系列的getXXX方法,可以获取Class中封装的其他信息;部分方法如下:

• java.lang.Class是使用反射的基础,那么获得Class对象就是重中之重,有三种方式可以得到Class对象:

创建Class对象

• 使用反射可以动态创建对象,Class类中定义了newInstance方法:
• 反射API中定义了构造方法类Constructor,前面介绍过,使用Class类中方法可以获得Constructor对象,Constructor类中定义了如下方法可以构建类的对象:
• Method类可以动态调用方法,并且可以返回方法相关的信息,Method类中的部分方法如下:
动态调用java方法

内省

• 在实际编程中,我们常常需要一些用来包装值对象的类,例如Student、Employee、Order,这些类中往往没有业务方法,只是为了把需要处理的实体对象进行封装,有这样的特征:
• 属性都是私有的;
• 有无参的public构造方法;
• 对私有属性根据需要提供 公有的getXxx方法以及setXxx方法;例如属性名称为name,则有getName方法返回属性name值,setName方法设置name值;注意方法的名称通常是get或set加上属性名称,并把属性名称的首字母大写;这些方法称为getters/setters;getters必须有返回值没有方法参数;setter值没有返回值,有方法参数;
• 符合这些特征的类,被称为JavaBean;
• 内省(Inspector)机制就是基于反射的基础,Java语言对Bean类属性、事件的一种缺省处理方法。;
• 与Java内省有关的主要类及接口有:
• java.beans.Introspector类: 为获得JavaBean属性、事件、方法提供了标准方法;通常使用其中的getBeanInfo方法返回BeanInfo对象;
• Java.beans.BeanInfo接口:不能直接实例化,通常通过Introspector类返回该类型对象,提供了返回属性描述符对象(PropertyDescriptor)、方法描述符对象(MethodDescriptor) 、bean描述符(BeanDescriptor)对象的方法;
• Java.beans.PropertyDescriptor类:用来描述一个属性,该属性有getter及setter方法;
• 只要类中有getXXX方法,或者setXXX方法,或者同时有getXXX及setXXX方法,其中getXXX方法没有方法参数,有返回值;setXXX方法没有返回值,有一个方法参数;那么内省机制就认为XXX为一个属性;

• 可以使用PropertyDescriptor类的方法获取属性相关的信息,例如getName方法返回属性的名字:
• //返回Employee类的BeanInfo对象
• BeanInfo employeeInfo=Introspector.getBeanInfo(Employee.class);
• //使用BeanInfo返回PropertyDescriptor对象数组
• PropertyDescriptor[] propsDes=employeeInfo.getPropertyDescriptors();
• //迭代所有的PropertyDescriptor,返回属性名字。由于从Object类继承getClass方法,所以属性名有class
• for(PropertyDescriptor prop:propsDes){
• System.out.println(prop.getName());
• }

• 很多框架都使用了内省机制检索对象的属性,定义属性名字时,名字最好起码以两个小写字母开头,例如stuName,而不要使用sName,某些情况下,可能会导致检索属性失败;
• 再次强调,内省机制检索属性时,是根据getter和setter方法确认属性名字,而不是根据类里声明的属性名决定;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值