下你所需,载你所想!
IT技术源码资料下载网站

非常好的Java基础反射总结

:其他软件 2020-07-07 17:15:17

非常好的Java基础反射总结

前言疯狂复习基础ing~
最近复习的Jv基础反射做了应该总结,果然反射不只有那么一点点东西,多的是精髓!
最重要的是最后推荐的那两篇文章,写的非常非常好!!反射
1.反射的原理Jv反射机制就是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性;这种动态获取信息以及动态调用对象的功能称为Jv语言的反射机制
粗略的理解:反射就是在程序运行时,能够动态的操作类的成员。2.反射的用途在日常的第三方应用开发过程中,经常会遇到某个类的成员变量、方法或是私有的或是只对系统应用开发,这时候就可以利用Jv的反射机制通过反射来获取所需的私有成员或方法,框架的底层就用到了很多反射相关的操作。3.反射机制的相关类与Jv反射相关的类如下类名
用途
Clss类
代表类的实体,在运行的Jv应用程序中表示类和接口
Field类
代表类的成员变量(成员变量也称为类的属性)
Meod类
代表类的方法
Consctor类
代表类的构造方法
3.1.Clss类Clss代表类的实体,在运行的Jv应用程序中表示类和接口。在这个类中提供类很多有用的方法。
获取类相关的方法方法
用途
sSbclss(Clssclzz)
把传递的类的对象转换成代表其子类的对象
Cst
把对象转换成代表类或是接口的对象
getClssLoder()
获得类的加载器
getClsses()
返回一个数组,数组中包含该类中所有公共类和接口类的对象
getDecldClsses()
返回一个数组,数组中包含该类中所有类和接口类的对象
forNme(SingclssNme)
根据类名返回类的对象
getNme()
获得类的完整路径名字
newInstnce()
创建类的实例
getPckge()
获得类的包
getSimleNme()
获得类的名字
getSerclss()
获得当前类继承的父类的名字
getInterfces()
获得当前类实现的类或是接口获取类中属性相关的方法方法
用途
getField(Singnme)
获得某个公有的属性对象
getFields()
获得所有公有的属性对象
getDecldField(Singnme)
获得某个属性对象
getDecldFields()
获得所有属性对象获取类中注解的相关方法方法
用途
getAnnottion(ClssnnottionClss)
返回该类中与参数类型匹配的公有注解对象
getAnnottions()
返回该类所有的公有注解对象
getDecldAnnottion(ClssnnottionClss)
返回该类中与参数类型匹配的所有注解对象
getDecldAnnottions()
返回该类所有的注解对象获取类中构造器相关的方法方法
用途
getConsctor(Clss…<?>rmeterTyes)
获得该类中与参数类型匹配的公有构造方法
getConsctors()
获得该类的所有公有构造方法
getDecldConsctor(Clss…<?>rmeterTyes)
获得该类中与参数类型匹配的构造方法,包含私有
getDecldConsctors()
获得该类所有构造方法获取类中方法的相关方法方法
用途
getMeod(Singnme,Clss…<?>rmeterTyes)
获得该类某个公有的方法
getMeods()
获得该类所有公有的方法
getDecldMeod(Singnme,Clss…<?>rmeterTyes)
获得该类某个方法
getDecldMeods()
获得该类所有方法类中其他重要的方法方法
用途
isAnnottion()
如果是注解类型则返回e
isAnnottionPsent(Clss<?extendsAnnottion>nnottionClss)
如果是指定类型注解类型则返回e
isAnonymosClss()
如果是匿名类则返回e
isArry()
如果是一个数组类则返回e
isEnm()
如果是枚举类则返回e
isInstnce(Objectobj)
如果obj是该类的实例则返回e
isInterfce()
如果是接口类则返回e
isLoclClss()
如果是局部类则返回e
isMemberClss()
如果是内部类则返回e
3.2.Field类Field代表类的成员变量对象(成员变量也称为类的属性)方法
用途
eqls(Objectobj)
属性与obj相等则返回e
get(Objectobj)
获得obj中对应的属性值
set(Objectobj,Objectvle)
设置obj中对应属性值
getNme()
获取类中属性的名字
3.3.Meod类Meod代表类的方法方法
用途
invoke(Objectobj,Object…rgs)
传递object对象及参数调用该对象对应的方法
3.4.Consctor类Consctor代表类的构造方法方法
用途
newInstnce(Object…inigs)
根据传递的参数创建类的对象
4.反射的前提通过字节码获取clss对象4.1.获取类的Clss对象的方式1.通过类的全路径名的字符串获取clss对象例如
Clssclzz=Clss.forNme("com.scholrTng.o.UserPo")
2.通过类名.clss获取clss对象例如
Clssclzz=UserPo.clss
3.通过类的实例获取父类的clss对象例如
Clssclzz=newUserPo().getClss();
4.通过子类的实例获取父类的类对象例如
UserPoser=newUser();
ClssserClzz=ser.getClss();
ClsssClzz=serClzz.getSerclss();5.反射操作1.通过反射获取目标类的类对象
2.通过类对象获取目标类中的构造方法对象,通过构造方法对象创建目标类对象
3.通过类对象获取目标类中的成员变量对象,在指定对象obj中将此成员变量对象表示的成员变量设置为指定的新值
4.通过类对象获取目标类中的指定方法对象,调用该方法
5.通过类对象获取目标类中的注解,获取注解中的参数信息5.1.准备准备一个目标类ckgecom.scholrTng.demo;**
*@AorScholrTng
*@Dte2020714:15下午
*@Desc程序员类
*bcclssProgrmmer{
**
*唯一标识
*
rivteSingid;
**
*姓名
*
rivteSingnme;
**
*年龄
*
rivteIntegerge;
**
*性别
*
rivteSingsex;
**
*工作经验
*
rivteIntegerworkExerience;bcSingwork(Singcontent){
nis.nme+"正在"+content;
}rivteSinglerning(Singcontent){
nis.nme+"正在"+content;}空参构造函数.......
有参构造函数.......
Get、Set.......
toSing.......}自定义注解类ckgecom.scholrTng.demo;imortjv.lng.nnottion.ElementTye;
imortjv.lng.nnottion.Retention;
imortjv.lng.nnottion.RetentionPocy;
imortjv.lng.nnottion.Trget;**
*@AorScholrTng
*@Dte2020744:15下午
*@Desc自定义注解,用来描述类的详细信息
*
@Trget({ElementTye.TYPE,ElementTye.FIELD})
@Retention(RetentionPocy.RUNTIME)
@Dected
bc@interfceClssDescribe{
Singdescribe()deft"";
}5.2.反射操作
1.通过反射获取目标类的类对象
**
*获取目标类的类对象(clss对象)获取类的类对象有三种方式,我这里选择的是通过类的全路径名来获取类的类对象
*
Clss<?>rogrmmerClzz=Clss.forNme("com.scholrTng.demo.Progrmmer");2.通过类对象获取目标类中的构造方法对象,通过构造方法对象创建目标类对象
**
*通过类对象获取被bc修饰的构造方法
*如果是获取空参构造方法,那么getConsctor()方法的传参为nl
*如果是获取有参构造方法(前提是必须要保证目标类中存在有参构造方法),那么getConsctor()方法的传参数为属性类型.clss
*
Consctor<?>consctor=rogrmmerClzz.getConsctor(Sing.clss,Sing.clss,Integer.clss,Sing.clss,Integer.clss);
**
*通过构造方法创建对象并在构造方法中为类中的成员变量赋值
*
Objectobj=consctor.newInstnce("CXY001","忙碌的指尖",20,"男",1);
**
*4.打印查看
*打印结果:Progrmmer{id='CXY001',nme='忙碌的指尖',ge=20,sex='男',workExerience=1}
*
System.ot.rintln(obj);3.通过类对象获取目标类中的成员变量对象,在指定对象obj中将此成员变量对象表示的成员变量设置为指定的新值
**
*获取类对象中的所有成员变量对象(包含公有、私有)
*
Field[]fields=rogrmmerClzz.getDecldFields();
for(Fieldfield:fields){
**
*暴力反射setAccessible(e);
*类对象中的成员可能有的是被私有化了(被bc修饰的就不需要进行这一步),这时候操作这些成员对象的时候Jv语言会开启访问检查,
*但是我们可以通过暴力反射的方式来关闭Jv语言访问检查,从而可以操作私有化的成员对象
*
field.setAccessible(e);
**
*获取通过构造方法创建的对象中的值
*打印结果:id:CXY001nme:忙碌的指尖ge:20sex:男workExerience:1
*
System.ot.rint(field.getNme()+":"+field.get(obj)+"");
}4.通过类对象获取目标类中的指定方法对象,调用该方法
**
*6.获取类对象中指定的方法对象,并调用这个方法
*
getMeod()获取类对象中指定的公有方法对象,方法有两个构造函数:第一个是方法的名字,第二个是方法的参数类型
MeodworkMeodObj=rogrmmerClzz.getMeod("work",Sing.clss);
调用类对象中的这个方法,不管方法是否有返回值,invoke()方法的返回值都会是Object
Objectinvoke=workMeodObj.invoke(obj,"写代码");
System.ot.rintln(invoke);
获取类对象中指定的方法,不管是公有的还是私有的都可以被获取到
MeodlerningMeodObj=rogrmmerClzz.getDecldMeod("lerning",Sing.clss);
如果是私有的方法要对其进行使用需要对其就行暴力反射
lerningMeodObj.setAccessible(e);
Objectinvoke=lerningMeodObj.invoke(obj,"学习反射");
System.ot.rintln(invoke);5.通过类对象获取目标类中的注解,获取注解中的参数信息
**
*获取类中与参数类型匹配的公有注解对象
*
ClssDescribennottion=rogrmmerClzz.getAnnottion(ClssDescribe.clss);
if(nnottion!=nl){
System.ot.rintln(nnottion.describe());
}6.深度好文推荐以上的内容我只是描述了反射是如何使用的,并没有描述太多真正的关于发射的内涵知识。
但是在复习反射的过程中我也查了比较多的资料,譬如下两篇把反射的描述淋漓尽致,自叹不如写不出这么有深度的文章,但是好的文章应该被更多人看到!学习jv应该如何理解反射?
为什么要反射?

TAG:

相关阅读

最新推荐