反射详解详细.docx
- 文档编号:28584860
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:30
- 大小:21.05KB
反射详解详细.docx
《反射详解详细.docx》由会员分享,可在线阅读,更多相关《反射详解详细.docx(30页珍藏版)》请在冰豆网上搜索。
反射详解详细
---------------------反射详解---------------------->
【案例1】通过一个对象获得完整的包名和类名
packageReflect;
/**
*通过一个对象获得完整的包名和类名
**/
classDemo{
//othercodes...
}
classhello{
publicstaticvoidmain(String[]args){
Demodemo=newDemo();
System.out.println(demo.getClass().getName());
}
}
【运行结果】:
Reflect.Demo
添加一句:
所有类的对象其实都是Class的实例。
【案例2】实例化Class类对象
packageReflect;
classDemo{
//othercodes...
}
classhello{
publicstaticvoidmain(String[]args){
Class
>demo1=null;
Class
>demo2=null;
Class
>demo3=null;
try{
//一般尽量采用这种形式
demo1=Class.forName("Reflect.Demo");
}catch(Exceptione){
e.printStackTrace();
}
demo2=newDemo().getClass();
demo3=Demo.class;
System.out.println("类名称"+demo1.getName());
System.out.println("类名称"+demo2.getName());
System.out.println("类名称"+demo3.getName());
}
}
【运行结果】:
类名称Reflect.Demo
类名称Reflect.Demo
类名称Reflect.Demo
【案例3】通过Class实例化其他类的对象
通过无参构造实例化对象
packageReflect;
classPerson{
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
@Override
publicStringtoString(){
return"["+this.name+""+this.age+"]";
}
privateStringname;
privateintage;
}
classhello{
publicstaticvoidmain(String[]args){
Class
>demo=null;
try{
demo=Class.forName("Reflect.Person");
}catch(Exceptione){
e.printStackTrace();
}
Personper=null;
try{
per=(Person)demo.newInstance();
}catch(InstantiationExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
per.setName("Rollen");
per.setAge(20);
System.out.println(per);
}
}
【运行结果】:
[Rollen20]
但是注意一下,当我们把Person中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的构造函数之后
,会出现错误:
比如我定义了一个构造函数:
publicPerson(Stringname,intage){
this.age=age;
this.name=name;
}
然后继续运行上面的程序,会出现:
java.lang.InstantiationException:
Reflect.Person
atjava.lang.Class.newInstance0(Class.java:
340)
atjava.lang.Class.newInstance(Class.java:
308)
atReflect.hello.main(hello.java:
39)
Exceptioninthread"main"java.lang.NullPointerException
atReflect.hello.main(hello.java:
47)
所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数
【案例】通过Class调用其他类中的构造函数(也可以通过这种方式通过Class创建其他类的对象)
packageReflect;
importjava.lang.reflect.Constructor;
classPerson{
publicPerson(){
}
publicPerson(Stringname){
this.name=name;
}
publicPerson(intage){
this.age=age;
}
publicPerson(Stringname,intage){
this.age=age;
this.name=name;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
@Override
publicStringtoString(){
return"["+this.name+""+this.age+"]";
}
privateStringname;
privateintage;
}
classhello{
publicstaticvoidmain(String[]args){
Class
>demo=null;
try{
demo=Class.forName("Reflect.Person");
}catch(Exceptione){
e.printStackTrace();
}
Personper1=null;
Personper2=null;
Personper3=null;
Personper4=null;
//取得全部的构造函数
Constructor
>cons[]=demo.getConstructors();
try{
per1=(Person)cons[0].newInstance();
per2=(Person)cons[1].newInstance("Rollen");
per3=(Person)cons[2].newInstance(20);
per4=(Person)cons[3].newInstance("Rollen",20);
}catch(Exceptione){
e.printStackTrace();
}
System.out.println(per1);
System.out.println(per2);
System.out.println(per3);
System.out.println(per4);
}
}
【运行结果】:
[null0]
[Rollen0]
[null20]
[Rollen20]
【案例】
返回一个类实现的接口:
packageReflect;
interfaceChina{
publicstaticfinalStringname="Rollen";
publicstaticintage=20;
publicvoidsayChina();
publicvoidsayHello(Stringname,intage);
}
classPersonimplementsChina{
publicPerson(){
}
publicPerson(Stringsex){
this.sex=sex;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
@Override
publicvoidsayChina(){
System.out.println("hello,china");
}
@Override
publicvoidsayHello(Stringname,intage){
System.out.println(name+""+age);
}
privateStringsex;
}
classhello{
publicstaticvoidmain(String[]args){
Class
>demo=null;
try{
demo=Class.forName("Reflect.Person");
}catch(Exceptione){
e.printStackTrace();
}
//保存所有的接口
Class
>intes[]=demo.getInterfaces();
for(inti=0;i System.out.println("实现的接口"+intes[i].getName()); } } } 【运行结果】: 实现的接口Reflect.China (注意,以下几个例子,都会用到这个例子的Person类,所以为节省篇幅,此处不再粘贴Person的代码部分,只粘贴主 类hello的代码) 【案例】: 取得其他类中的父类 classhello{ publicstaticvoidmain(String[]args){ Class >demo=null; try{ demo=Class.forName("Reflect.Person"); }catch(Exceptione){ e.printStackTrace(); } //取得父类 Class >temp=demo.getSuperclass(); System.out.println("继承的父类为: "+temp.getName()); } } 【运行结果】 继承的父类为: java.lang.Object 【案例】: 获得其他类中的全部构造函数 这个例子需要在程序开头添加importjava.lang.reflect.*; 然后将主类编写为: classhello{ publicstaticvoidmain(String[]args){ Class >demo=null; try{ demo=Class.forName("Reflect.Person"); }catch(Exceptione){ e.printStackTrace(); } Constructor >cons[]=demo.getConstructors(); for(inti=0;i System.out.println("构造方法: "+cons[i]); } } } 【运行结果】: 构造方法: publicReflect.Person() 构造方法: publicReflect.Person(java.lang.String) 但是细心的读者会发现,上面的构造函数没有public或者private这一类的修饰符 下面这个例子我们就来获取修饰符 classhello{ publicstaticvoidmain(String[]args){ Class >demo=null; try{ demo=Class.forName("Reflect.Person"); }catch(Exceptione){ e.printStackTrace(); } Constructor >cons[]=demo.getConstructors(); for(inti=0;i Class >p[]=cons[i].getParameterTypes(); System.out.print("构造方法: "); intmo=cons[i].getModifiers(); System.out.print(Modifier.toString(mo)+""); System.out.print(cons[i].getName()); System.out.print("("); for(intj=0;j System.out.print(p[j].getName()+"arg"+i); if(j System.out.print(","); } } System.out.println("){}"); } } } 【运行结果】: 构造方法: publicReflect.Person(){} 构造方法: publicReflect.Person(java.lang.Stringarg1){} 有时候一个方法可能还有异常,呵呵。 下面看看: classhello{ publicstaticvoidmain(String[]args){ Class >demo=null; try{ demo=Class.forName("Reflect.Person"); }catch(Exceptione){ e.printStackTrace(); } Methodmethod[]=demo.getMethods(); for(inti=0;i Class >returnType=method[i].getReturnType(); Class >para[]=method[i].getParameterTypes(); inttemp=method[i].getModifiers(); System.out.print(Modifier.toString(temp)+""); System.out.print(returnType.getName()+""); System.out.print(method[i].getName()+""); System.out.print("("); for(intj=0;j System.out.print(para[j].getName()+""+"arg"+j); if(j System.out.print(","); } } Class >exce[]=method[i].getExceptionTypes(); if(exce.length>0){ System.out.print(")throws"); for(intk=0;k System.out.print(exce[k].getName()+""); if(k System.out.print(","); } } }else{ System.out.print(")"); } System.out.println(); } } } 【运行结果】: publicjava.lang.StringgetSex() publicvoidsetSex(java.lang.Stringarg0) publicvoidsayChina() publicvoidsayHello(java.lang.Stringarg0,intarg1) publicfinalnativevoidwait(longarg0)throwsjava.lang.InterruptedException publicfinalvoidwait()throwsjava.lang.InterruptedException publicfinalvoidwait(longarg0,intarg1)throwsjava.lang.InterruptedException publicbooleanequals(java.lang.Objectarg0) publicjava.lang.StringtoString() publicnativeinthashCode() publicfinalnativejava.lang.ClassgetClass() publicfinalnativevoidnotify() publicfinalnativevoidnotifyAll() 【案例】接下来让我们取得其他类的全部属性吧,最后我讲这些整理在一起,也就是通过class取得一个类的全部框架 classhello{ publicstaticvoidmain(String[]args){ Class >demo=null; try{ demo=Class.forName("Reflect.Person"); }catch(Exceptione){ e.printStackTrace(); } System.out.println("===============本类属性========================"); //取得本类的全部属性 Field[]field=demo.getDeclaredFields(); for(inti=0;i //权限修饰符 intmo=field[i].getModifiers(); Stringpriv=Modifier.toString(mo); //属性类型 Class >type=field[i].getType(); System.out.println(priv+""+type.getName()+"" +field[i].getName()+";"); } System.out.println("===============实现的接口或者父类的属性========================"); //取得实现的接口或者父类的属性 Field[]filed1=demo.getFields(); for(intj=0;j //权限修饰符 intmo=filed1[j].getModifiers(); Stringpriv=Modifier.toString(mo); //属性类型 Class >type=filed1[j].getType(); System.out.println(priv+""+type.getName()+"" +filed1[j].getName()+";"); } } } 【运行结果】: ===============本类属性======================== privatejava.lang.Stringsex; ===============实现的接口或者父类的属性======================== publicstaticfinaljava.lang.Stringname; publicstaticfinalintage; 【案例】其实还可以通过反射调用其他类中的方法: classhello{ publicstaticvoidmain(String[]args){ Class >demo=null; try{ demo=Class.forName("Reflect.Person"); }catch(Exceptione){ e.printStackTrace(); } try{ //调用Person类中的sayChina方法 Methodmethod=demo.getMethod("sayChina"); method.invoke(demo.newInstance()); //调用Person的sayHello方法 method=demo.getMethod("sayHello",String.class,int.clas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 反射 详解 详细