版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高级编程Java
本章内容提要Java反射机制AnnotationJava代
理012.1.1Java反射机制简介反射(Reflection)
机制是一种程序设计语言功能,可
以实现在程序解释、运行时动态加载类,实例化对象,并
可查看类申成员变量和方法的信息、定义对象并操作对象
使用成员变量和调用方法。Java反射机制是通过Class类中
相关方法的使用实现的,其中,Class
类中的类方
法
:public
static
Class<T>forName(String
className)throws
ClassNotFountException可以通过参数加载一个类,创建一个Class对象,之后该
Class对象调用方法:public
T
newInstance()即可获取一个被加载的类的对象方式。12.!Java反射机制abstractclassSonyProduct{Stringtype;double
price;abstractvoidprintlnfo();}classSonyCameraextendsSonyProduct{voidprintlnfo(){Sysntln("TheSonyCamera:type-"+type+",price-
+price+"!);}}例12-1importjScanner;12.!Java反射机制classSonyTVextendsSonyProduct{voidprintInfo(){Sysntln("TheSonyTV:type-"+type+",price-
"+price+"!");了}publicclass
Example12_1{publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);Sysntln("Please
inputproduct:");StringclassName=scan.next();Sysntln("Please
inputtypeofproduct:");12.!Java反射机制
12.!Java
反射机制Stringtype=scan.next();Sysntln("Please
inputpriceofproduct:");doubleprice=scan.nextDouble();try{Classc=Class.forName(className);SonyProductsonyProduct=(SonyProduct)c.newlnstance();sonyProduct.type=type;sonyProduct.price=price;sonyProduct.printlnfo();}catch(ClassNotFoundExceptione){Sysntln(e);}catch(InstantiationExceptione){Sysntln(e);}catch(IllegalAccessExceptione){Sysntln(e);}}
12.!Java反射机制
12.1.2类加载器利用反射机制创建对象与直接通过构造方法创建对象是Java中定义对象的两种方式,但其本质上都是通过类加载器来完成的。类加载
器用于加载Java字节码文件,它的执行过程反
映了Java程序运行时引入的类库及字节码文件
的加载过程。publicvoidprintlnfo(){Sysntln("Iam"+name+",I
am
"+nation+"!");例12-2classStudent{
String
name;String
nation;12.!Java
反射机制publicclass
Example12_2{publicstaticvoidmain(String[]args){
Studentstu=newStudent();="LiMing";stu.nation="Chinese";stu.printInfo();}}12.!Java
反射机制13.2套接字通信对象stu的创建过程就是通过类加载器完成的。具体的顺
序是
:(1)在Java
解释、运行命令执行时,启动Java虚拟机(寻找
并执行Java安装目录下JRE文件夹中的jvm.dll文件)。(2)生成引导程序加载器(BootStrap
Loader),它用来加
载
Java
的核心库。(3)引导程序加载器加载扩展加载器(Extended
Loader),并设定引导程序加载器为扩展加载器的父类。扩展加载器用
来加载
Java
的扩展库。(4)引导程序加载器加载系统加载器(System
Loader),并设定扩展加载器为系统加载器的父类。系统加载器用来加载
自
定义类。
12.!Java反射机制
(5)系统加载器开始加载指定的类
,其中,每个类加载器会先
将加载任务交给其父类,系统加载器搜索环境变量classPath和当前程序运行目录下的类(联想一下classPath环境变量值的设
置
)
。(6)扩展加载器搜索Java安装目录下JRE文件夹中lib¥ext¥classes目录下的.class
文件或lib¥ext
目录下的
.jar
文
件
。(7)引导程序加载器会搜索Java安装目录下JRE文件夹中classes目录下的
.class
文件,或lib目录下的.jar
文件。此时,若没有找到要加载的类,就会抛出NoClassDefoundException异
常
。
12.!Java
反射机制
12.1.3
利用反射机制使用成员变量和方法使用Class类可以实现Java反射机制动态加载一
个类,同时,Class
类中还提供了一些方法,用以获
取被加载类中定义的成员变量和方法。通过这些的方
法,不仅可以进一步获取被加载类中成员变量和方法
的相关信息,甚至进行类中成员变量的使用和方法的
调
用
。例12-3importjScanner;import
jlect.*;classTestDemo{int
a;voidtest(Strings,doubleb){Sysntln(a);Sysntln(b);Sysntln(s);}class
Example12_3{publicstaticvoidmain(String[]args){12.!Java
反射机制Java
12.!Java
反射机制
Scannerscan=newScanner(System.in);Classc=Class.forName(className);"test",newClass[]{String.class,Double.TYPE});method.invoke(object,newObject[]{"LiMing",20});
Fieldfield=c.getDeclaredField("a");field.setlnt(object,88);method.invoke(object,newObject[]{"Lisa",90});Sysntln(e);}}Objectobject=c.newlnstance();Method
method=c.getDeclaredMethod(StringclassName=scan.next();}catch(Exceptione){try{
12.!Java反射机制在Java反射机制中,Class
类的应用就是反射的
核心。利用Class类可以完成Java反射机制的各项功
能——定义任意一个类的对象、获取任意一个类所具有的成员变量和方法、使用任意一个类的成员变量、
调用任意一个对象的方法,即动态定义对象并对其进
行操作,体现了程序的灵活性。在实际应用中使用Java反射与使用Class类两者是一致的。12.2.1
Annotation简介从JDK1.5开始,Java引人了名为Annotaion的特性,
用以增强Java程序的功能。Annotation
中文释义为注解、
注释。在应用时
,可以置于包定义、类声明、成员变量定
义
、方法声明、局部变量定义等内容之上,基本格式有四种,分别为:■
@Annotation名称(paraml=valuel,param2={value2,value3,……})■@Annotation名称({
valuel,valuel,……)■@Annotation名称(唯一参数值)■
@Annotation名称12.2Aonotation
12.2Aonotation
注释是程序开发人员在程序的编写过程中为程序添加的解释和说明,便于日后程序开发人员对程序进行阅读和
维
护
。Annotation的注释不同于传统的注释,它不是为程
序开发人员提供的阅读内容,而是提供给Java编译器的,换言之,Annotation是为Java
编译器准备的“注释”,用
于告知编译器需要执行的操作。正是由于Annotation是由
编译器进行“阅读”的,所以在程序中编写的Annotation
对程序自身的执行结果没有任何影响。在这个接口中,定义了四个方法:■public
Annotation
getAnnotation(Class
annotationType)
返回为当前对象添加的annotationType类型的注释对象■
public
Annotation[]getAnnotations()返回为当前对象添加的所有注释对象■
public
Annotation[]getDeclaredAnnotations()返回
为当前对象直接添加的所有注释对象,不包括继承的Annotationpublic
booleanisAnnotationPresent(Class
annotationType)
判断当前对
象上是否添加了参数annotationType指定的注释
,如果添加了,返回true,否则,返回false12.2
Aonotation
12.2Aonotation
在反射机制中经常用到的Package
、Class
、Field、Method等类都实现了AnnotatedElement
接口,因此这些类的
对象可以利用实现的接口方法获取在其上添加的Annotation信息,执行编写的相关Annotation内容所设定的操作。这些操作均是Java编译器在进行源程序编译的过程中完成的,使
得程序在进行编译和之后的解释、运行过程中,不仅执行源
程序原有的内容,还将执行Annotation指定的操作,增强了
源程序的功能。12.2.2三个常用的Annotation1.OverridejOverride用手标注方法,说
明方法是一个重写的方法,起
到了标识作用,属于一种标记Annotation。如果Override标注
的方法并不是一个重写的方法,则程序在编译过程中会报错。利用Override的这种重写标识作用,可以更加准确的表明一个方法的使用特点,提高程序可读性。12.2Aonotation2.DeprecatedjDeprecated可以标注方法,也可以标注成员变量,说明方
法或成员变量已经过时,不再建议被使用,也属于一种标记Annotation。所谓方法或成员变量的过
时
,指的是方法的功能已经由其
它方法实现,或成员变量表示的属性已经有更合理的名称,因此不再建议继续使用
。此
时
,并不是不能使用,只是不建议使
用,而在程序编译时,会给出警告,表示使用了已经过时的方
法或成员变量。12.2Aonotation例12-4publicclass
DeprecatedTest{@Deprecatedpublicvoidprintlnfo(){Sysntln("This
isa
Deprecatedtest!");class
Example12_4{publicstaticvoidmain(String[]args){DeprecatedTestdt=new
DeprecatedTest();
dt.printlnfo();L}12.2
Aonotation}
12.2Aonotation
3.SuppressWarningsjSuppressWarning可以标注类和方法,压制类体和方法体
中出现的警告,也可以标注成员变量,压制对成员变量的警告。通过压制警告,可以禁止编译后警告信息的显示。SurppressWarnings在使用时需要设置参数,指定需要压制
的警告信息类别。因此,SurppressWarnings
不属于标记Annotation,是一种标准Annotation,这也是它与Override
和
Deprecated的主要区别。参数说明deprecation压制过时警告unchecked压制类型转换警告,如定义集合某些对象时未使用泛
型fallthrough压制switch语句中某分支case中没有break语句的警告path压制在类、源文件等路径中有不存在的文件的警告serial压制类声明时未进行序列化的警告finally压制finally字句不能正常执行的警告static-access压制类变量、类方法使用时未按类名调用的警告all压制以上所用警告12.2Aonotation
12.2Aonotation
12.2.3
自定义Annotation
的实现Annotation增强了Java程序的功能,但JDK提供的Annotation毕竟有限,因此,自定义Annotation的应用就变得
非常有价值。自定义Annotation从格式上来看,类似于定义一
个接口,只不过使用的是@interface,同
时还需要加入Retention
和Target
两种Annotation,
使其发挥作用。1
.
自定义标记Annotation标记Annotation仅起到标识作用,因此,自定义标记
Annotation也仅进行标识。例12-5public@interface
MarkerAnnotationTest{}
class
Example12_5{@MarkerAnnotationTestpublicvoidmethod(){Sysntln("The
MarkerAnnotationtest.");}publicstaticvoidmain(String[]args){TestMaintest=newTestMain();test.method();12.2
Aonotation}
J
}12.2Aonotation在进行Annotation
的定义时,需要为Annotation添加Retention
Annotation,用于告知编译器如何对待自定义的Annotation,之后再利用Java反射机制完成对自定义Annotation的
获取和操作。RetentionAnnotation在使用时
,需要使用RetentionPolicy类中的类常量作为参数。参数一共有三个,分
别为
:□
RetentionPolicy.SOURCE□
RetentionPolicy.CLASS□
RetentionPolicy.RUNTIME常量含义常量含义TYPE目标是类、接口、
枚举类型8PNSTRUCT且标是构造方
法FIELD目标是成员变量ABCAL
VARI目标是局部变
量METHOD目标是非构造方法ANVOTATION目
标
是Annotation枪RAME目标是方法的参数PACKAGE目标是包最后,还可以为自定义Annotation添加TargetAnnotation,
指定自定义Annotation标注的目标。Target
Annotation在添加时要设置参数,取值为jotation.ElementType枚举类型中的一个常量。ElementType定
义的枚举常量包括:12.2Aonotation例12-6importjotation.Retention;importjotation.RetentionPolicy;importjotation.ElementType;importjotation.Target;importjlect.Method;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceMarkerAnnotationTest{了class
Example12_6{@MarkerAnnotationTest12.2
AonotationpublicvoidtestMethod(){SysntIn("The
MarkerAnnotationtest.");}publicstaticvoidmain(String[]args){Classc=TestMain.class;try
{Methodmethod=c.getMethod("testMethod");if(method.isAnnotationPresent(MarkerAnnotationTest.class)){Sysntln("Find
MarkerAnnotation!");
}else{Sysntln("NoAnnotationbefound.");}12.2
AonotationTestMaintest=(TestMain)c.newlnstance();
test.method();}catch(NoSuchMethodExceptione){Sysntln(e);}catch(InstantiationExceptione){Sysntln(e);}catch(IllegalAccessExceptione){Sysntln(e);12.2
AonotationL
J
h
J
L
了12.2Aonotation2.
自定义标准Annotation标准Annotation可以在使用时指定参数,由编译器进行处
理,因此自定义标准Annotation
具有更强的实用价值,很多Java企业级应用程序的实现都是通过自定义标准Annotation完成
的
。自定义标准Annotation在实现时,可以在接口体中定义抽
象方法,作为自定义标准Annotation使用时的参数。例12-7import
jotation.Retention;import
jotation.RetentionPolicy;import
jotation.Target;import
jotation.ElementType;import
jlect.Field;import
jlect.Method;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public
@interface
StandardAnnotationTest{String
name();了12.2
Aonotationpublicvoidprintlnfo(){Sysntln("ByStardardAnnotationout!");}}class
LoadedClass{@StandardAnnotationTest(name="AnalyClass")
publicAnalyClassanay;}class
Example12_7{publicstaticvoidmain(String[]args){Classc=LoadedClass.class;classAnalyClass{12.2
Aonotationtry{Fieldfield=c.getField("anay");if(field.isAnnotationPresent(StandardAnnotationTest.class){StandardAnnotationTeststand=field.getAnnotation(StandardAnnotationTest.class);
StringclassName=();Classtemp=Class.forName(className);Objectobject=temp.newlnstance();Methodmethod=temp.getDeclaredMethod("printlnfo");
method.invoke(object);}catch(Exceptione){Sysntln(e);12.2
Aonotation12.3代理机制Java代理机制是程序设计的一种模式,表示为某些对象提供一种代理操作以完成对这个对象的访问,即在客户端对象和目标对象之间引人一个申介一代理对象,由这个代理对象完成对目标对象的调用。由于通过代理调用目标对象,所以可以在完成目标对象操作的同时添加一些其他操作,扩展了程序的功能。代理机制分为两种一静态代理和动态代理。12.3代理机制12.3.1静态代理静态代理,是一种将代理对象(房屋中介)与目标对象
(
租房者)
绑定的操作方法,两者的关系通过接口建立。接口提
供代理对象与目标对象共有的功能,如租房,代理类和目标类
均使用该接口,并在代理类中声明目标对象,由目标对象执行
相关操作(房屋中介提供的租房功能最终还是要由租房者完成)
,
而
在
目标对象执行操作时,可进行其它功能的添加(房屋中介需要在租房过程中收取中介费),借助代理扩展程序的功能。12.3代理机制Java例12-8interface
Business{publicvoidrenting();}class
Lessee
implements
Business{publicvoidrenting(){Sysntln("Rentinga
house.");}class
Intermediary
implements
Business{
private
Lessee
lessee;publicIntermediary
(){lessee=new
Lessee();publicvoidrenting(){Sysntln("Charging");lessee.renting();}}publicclass
Example12_8{publicstaticvoidmain(String[]args){Intermediarymedium=newIntermediary();medium.renting();}}12.3代理机制}12.3代理机制静态代理的实
现
,要求目标对象必须是事先已经存在的,
需要将其作为代理对象的内部属性,即一个目标对象必须对应
一个代理对象。此时,随着目标对象的增多,代理对象也会随
着增多,导致程序中类的个数成倍增长
,程序规模将变得越来
越大。此外,如果事先并不知道目标对象(房屋中介并不确定
顾客是谁),或者代理操作的内容发生变化(房屋中介不再做
房屋中介,改做留学中介),该如何使用代理呢?12.3.2动态代理动态代理是一种非常灵活的代理方式,应用也最为普逼。
Java动态代理的实现同样需要定义接口一提供代理对象与目标
对象共有的功能,之后定义目标对象所属类并使用该接口,这
与静态代理的过程一致。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某著名企业商业地产盈利模式深度解析及二三线商业
- 电机与电气控制技术 课件 项目3 变压器的应用与维护
- 《GB-T 25310-2010固定式点、凸焊机》专题研究报告
- 《GB 5959.7-2008电热装置的安全 第7部分:对具有电子枪的装置的特殊要求》专题研究报告
- 《GBT 22122-2008数字电视环绕声伴音测量方法》专题研究报告
- 《GBT 17552-2008信息技术 识别卡 金融交易卡》专题研究报告
- 道路安全培训效果评价课件
- 2026年鲁教版九年级道德与法治教育上册月考题库试题附答案
- 2026年河北廊坊市高职单招职业适应性测试试题解析及答案
- 2025-2026年西师版二年级数学上册期末考试题库(附含答案)
- 中建三局2024年项目经理思维导图
- 小区道闸管理办法
- DB42-T 2391-2025 全域国土综合整治项目实施方案编制指南
- DB3301∕T 0419-2023 婴幼儿成长驿站管理与服务规范
- 老年医院重点专科建设方案
- 2025年江苏省苏州市初二(上)英语期末模拟卷(二)含答案
- 规培中医病例讨论流程规范
- 银行解封协议书模板
- 小学生必读书试题及答案
- 超星尔雅学习通《学术规范与学术伦理(华东师范大学)》2025章节测试附答案
- (完整版)现用九年级化学电子版教材(下册)
评论
0/150
提交评论