反射应用取得类的结构_第1页
反射应用取得类的结构_第2页
反射应用取得类的结构_第3页
反射应用取得类的结构_第4页
反射应用取得类的结构_第5页
已阅读5页,还剩14页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论