版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA应用开发详解第15章:JAVA反射机制——反射应用——取得类的结构MLDN软件教学研发部本章目标可以使用反射取得实现的全部接口可以使用反射取得一个类所继承的父类可以使用反射取得一个类的全部构造方法可以使用反射取得一个类中的全部方法可以使用反射取得一个类中的全部属性反射机制的深入——取得类的结构在实际开发中,以上的程序就是反射应用最多的地方,当然,反射机制所提供的功能远不止如次,还可以通过反射得到一个类的完整结构,那么这就要使用到java.lang.reflect包中的以下几个类:Constructor:表示类中的构造方法Field:表示类中的属性Method:表示类中的方法这三个类都是AccessibleObject类的子类。操作类packageorg.lxh.demo15;interfaceChina{ //定义China接口
public
static
finalStringNATIONAL="China"; //定义全局常量
public
static
finalStringAUTHOR="李兴华"; //定义全局常量
public
voidsayChina(); //定义无参的抽象方法
publicStringsayHello(Stringname,intage); //定义有参的抽象方法}public
classPersonimplementsChina{ //定义Person类实现接口
privateStringname; //定义name属性
private
int
age; //定义age属性
publicPerson(){ //声明无参构造
}
publicPerson(Stringname){ //声明有一个参数的构造方法
=name; //为name属性赋值
}
publicPerson(Stringname,intage){ //声明有两个参数的构造方法
this(name); //调用有一个参数的构造
this.setAge(age); //为age属性赋值
}
//setter、getter
public
voidsayChina(){ //覆写方法输出信息
System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL); }
publicStringsayHello(Stringname,intage){ //覆写方法,返回信息
returnname+",你好!我今年"+age+"岁了!"; }}取得所实现的全部接口要想取得一个类所实现的全部接口,则必须使用Class类中的getInterfaces()方法。此方法定义如下:publicClass[]getInterfaces()此方法返回一个Class类的对象数组,之后就可以直接利用Class类中的getName()方法输出即可。取得Person类实现的全部接口packageorg.lxh.demo15.classinfodemo;public
classGetInterfaceDemo{
public
static
voidmain(String[]args){ Class<?>c1=null; //声明Class对象
try{ c1=Class.forName("org.lxh.demo15.Person");//实例化Class对象
}catch(ClassNotFoundExceptione){ e.printStackTrace(); } Class<?>c[]=c1.getInterfaces(); //取得实现的全部接口
for(inti=0;i<c.length;i++){ System.out.println("实现的接口名称:"+c[i].getName()); //输出接口名称
} }}取得父类一个类可以实现多个接口,但是只能继承一个父类,所以如果要想取得一个类的父类,可以直接使用Class类中的getSuperclass()方法。此方法定义如下:publicClass<?superT>getSuperclass()此方法返回的是Class实例,和之前的得到接口一样,可以通过getName()方法取得名称。取得Person的父类packageorg.lxh.demo15.classinfodemo;public
classGetSuperClassDemo{
public
static
voidmain(String[]args){ Class<?>c1=null; //声明Class对象
try{ c1=Class.forName("org.lxh.demo15.Person");//实例化Class对象
}catch(ClassNotFoundExceptione){ e.printStackTrace(); } Class<?>c2=c1.getSuperclass(); //取得父类
System.out.println("父类名称:"+c2.getName()); //输出信息
}}取得全部构造方法packageorg.lxh.demo15.classinfodemo;importjava.lang.reflect.Constructor; //导入反射操作包public
classGetConstructorDemo01{
public
static
voidmain(String[]args){ Class<?>c1=null; //声明Class对象
try{ c1=Class.forName("org.lxh.demo15.Person");//实例化Class对象
}catch(ClassNotFoundExceptione){ e.printStackTrace(); } Constructor<?>con[]=c1.getConstructors(); //得到全部构造方法
for(inti=0;i<con.length;i++){ //循环输出
System.out.println("构造方法:"+con[i]); //直接打印输出
} }}进一步延伸以上确实取得了全部的构造方法,以上取得的时候是直接通过输出Constructor对象得到的完整信息,是比较全的信息,当然,用户也可以自己手工拼凑出信息。取得一个类的全部构造方法importjava.lang.reflect.Constructor;public
classGetConstructorDemo02{
public
static
voidmain(String[]args){ Class<?>c1=null; //声明Class对象
try{ c1=Class.forName("org.lxh.demo15.Person"); //实例化Class对象
}catch(ClassNotFoundExceptione){ e.printStackTrace(); } Constructor<?>con[]=c1.getConstructors(); //得到全部构造
for(inti=0;i<con.length;i++){ //循环输出
Class<?>p[]=con[i].getParameterTypes(); //列出构造中的参数类型
System.out.print("构造方法:"); System.out.print(con[i].getModifiers()+""); //取出权限
System.out.print(con[i].getName()); //输出构造方法名称
System.out.print("("); //输出“(”
for(intj=0;j<p.length;j++){ //循环输出
System.out.print(p[j].getName()+"arg"+i); //打印参数类型
if(j<p.length-1){ //判断是否要输出“,” System.out.print(","); //输出“,” } } System.out.println("){}"); //输出“){}” } }}还原修饰符从之前程序结果中可以发现,已经取得了构造方法的方法名称及参数类型,但是在取得权限的时候却发现返回的是一个数字而不是public,这是因为在整个JAVA中对于方法的修饰符是使用一定的数字表示出来的,而如果要想把这个数字还原成用户可以看懂的关键字,则必须依靠Modifier类完成,此类定义在java.lang.reflect包中。直接使用Modifier类的以下方法即可将修饰符:publicstaticStringtoString(intmod)intmo=con[i].getModifiers(); //取出权限System.out.print(Modifier.toString(mo)+""); //还原权限取得全部方法要想取得一个类中的全部方法,可以使用Class类中的getDeclaredMethods()方法,此方法返回一个Method类的对象数组,而如果要想进一步取得方法的具体信息,例如方法的参数,抛出的异常声明等,则就必须依靠Method类。
Method类的常用方法No.方法类型描述1publicintgetModifiers()普通取得本方法的访问修饰符2publicStringgetName()普通取得方法的名称3publicClass<?>[]getParameterTypes()普通得到方法的全部参数类型4publicClass<?>getReturnType()普通得到方法的返回值类型5publicClass<?>[]getExceptionTypes()普通得到一个方法的全部抛出异常6publicObjectinvoke(Objectobj,Object...args)throwsIllegalAccessException,IllegalArgumentException,InvocationTargetException普通通过反射调用类中的方法,此方法在后面将为读者介绍。取得全部属性在反射操作中也同样可以取得一个类中的全部属性,但是在取得属性的时候有以下两种不同的操作:得到实现的接口或父类中的公共属性:publicField[]getFields()throwsSecurityException。得到本类中的全部属性:publicField[]getDeclaredFields()throwsSecurityException。以上方法返回的都是Field的数组,每一个Field对象就表示类中的一个属性。Field类的常用方法No.方法类型描述1publicObjectget(Objectobj)throwsIllegalArgumentException,IllegalAccessException普通得到一个对象中属性的具体内容2publicvoidset(Objectobj,Objectvalue)throwsIllegalArgumentException,IllegalAccessException普通设置指定对象中属性的具体内容3publicintgetModifiers()普通得到属性的修饰符4publicStringgetName()普通返回此属性的名称5publicbooleanisAccessible()普通判断此属性是否可被外部访问6publicvoidsetAccessible(booleanflag)throwsSecurityException普通设置一个属性是否可被外部访问7publicstaticvoidsetAccessible(AccessibleObject[]array,booleanflag)throwsSecurityException普通将一组属性设置是否可被外部访问8publicStringtoString()普通返回此Field类的信息取得Person类中的属性——取得本类属性importjava.lang.reflect.Field;importjava.lang.reflect.Modifier;public
classGetFieldDemo{
public
static
voidmain(String[]args){ Class<?>c1=null; //声明Class对象
try{ c1=Class.forName("org.lxh.demo15.Person"); //实例化Class对象
}catch(ClassNotFoundExceptione){ e.printStackTrace(); } { //普通代码块
Fieldf[]=c1.getDeclaredFields(); //取得本类属性
for(inti=0;i<f.length;i++){ //循环输出
Class<?>r=f[i].getType(); //取得属性的类型
intmo=f[i].getModifiers();//得到修饰符数字
Stringpriv=Modifier.toString(mo); //取得属性的修饰符
System.out.print("本类属性:"); System.out.print(priv+""); //输出修饰符
System.out.print(r.getName()+""); //输出属性类型
System.out.print(f[i].getName()); //输出属性名称
System.out.println(";"); //换行
} } }}取得Person类中的属性——取得父类公共属性importjava.lang.reflect.Field;importjava.lang.reflect.Modifier;public
classGetFieldDemo{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 瓷砖铺贴考试题目及答案
- 药店双通道定点零售药店药品管理制度
- 益智题目及答案看怎么做
- 二次函数拟合题目及答案
- 养老院老人精神关怀制度
- 金职院教育学题目及答案
- 养老院环境卫生与绿化制度
- 高三数学图形图解题目及答案
- 铁路货运生产统计制度
- 判断题如何记顺序题目及答案
- 河北省邢台市2025-2026学年七年级上学期期末考试历史试卷(含答案)
- 2026届南通市高二数学第一学期期末统考试题含解析
- 2026中国电信四川公用信息产业有限责任公司社会成熟人才招聘备考题库有完整答案详解
- 2026中国电信四川公用信息产业有限责任公司社会成熟人才招聘备考题库有答案详解
- 电力建设工程工程量清单计算规范 变电工程
- 矿用隔爆兼本质安全型真空电磁起动器
- 历年同等学力申硕公共管理真题及答案
- 果树整形修剪技术5
- 社会学概论(第2版)PPT完整全套教学课件
- RB/T 208-2016化学实验室内部质量控制比对试验
- GB/T 37898-2019风力发电机组吊装安全技术规程
评论
0/150
提交评论