第十六章 反射与注解

通过java的反射机制,程序员可以更深入的控制程序的运行过程。例如,可在程序运行时对象用户输入的信息进行验证,还可以逆向控制程序的执行过程,讲解了反射,另外java还提供了Annotation注解功能,该功能建立在反射机制的基础上,包括定义Annotation类型的方法和程序运行时访问Anntation信息的方法

60fff77390d24dbc811044ac02720638.jpg

 16.1反射

通过java反射机制,可以在程序中访问以及装载到JVM中的java对象的描述实现方法。检查喝修改描述java对象本身的信息的功能 java反射机制功能十分强大,在java.lang.reflect包中提供了该功能的支持

众所周知,所有jvaa类俊继承了Object类在Object类中定义了一个getClass()方法 该方法返回了一个类信息为Class的对象 代码如下:

        demo1 d1 = new demo1();

  Class c1 = d1.getClass();//先new一个对象然后使用getClass方法来获取

        //第二种方法

  Class c2= demo1.class;

        第三种方法直接使用forName方法来获取 其中括号内传入的时包名和类名

  Class c3= Class.forName("com.cr.demo1");

利用Class类的对象demo1,可以访问用来返回该对象的demo1对象的描述信息,可以访问的主要描述信息如下

组成部分 访问方法 返回值类型 说明

包路径 getPackage() Package对象 获取该类的存放路径

类名称 getName() String对象 获取该类名称

继承类 getSuperclass Class对象 获取该类的继承类

实现接口 getInterfaces() Class型数组 获取该类实现的所有接口

构造方法 getConstructors() Constructor型数组 获取所有权限为public的构造方法

getConstructor(Class<?>...parameterTypers) Constructor对象 获取指定构造方法

getDeclaredConstructors() Constructor型数组 获取所有构造方法

getDeclaredConstructors(Class<?>...parameterTypers) Constructor对象 获取自动那个构造方法

方法 getMethods() Method型数组 获取所有权限为public的指定方法

getMethod(String name,Class<?>...parameterTypes)

Method对象 获取权限为public的指定方法

getDeclardMethod() Method型数组 获取所有方法getDeclaredMethod(String name,Class<?>...parameterTypes) Method对象 获取指定方法

成员变量 getFields() Field数组 获取所有权限为public的成员变量

getFields(String name) Field对象 获取权限为public的指定的成员变量

getDeclaredFields() Field数组 获取所有成员变量

getDeclaredField(String name) Field对象 获取指定成员变量

内部类 getClasses() Class型数组 获取所有权限为public的内部类

getDeclaredClasses() Class型数组 获取所有内部类

内部类的声明类 getDeclaringClass() Class对象 如果改类为内部类,则返回她的成员变量否则返回null

内置注解

内置注解有三种

以下三种代码都不会影响我们代码的正常运行 是写个编译器看的  

@Override限定重写父类方法 作用范围使用在成员方法上

@SuppresWarnings(警告)抑制编译器警告//作用范围类成员属性 成员方法

@Deprecated 标识已经过时//作用范围类成员属性 成员方法

自定义注解

在定义Annotation类型时,也需要用到来i当以的interface关键字,但需要在interface关键字前加一个@符号,即定义Annotation类型的关键字@interface,这个关键字的隐含意思是继承java.lang.annotation.Annotation接口.如下:

public @interface demo{

}

访问Annotation信息

 

如果在定义Annotation类型时讲@Retention设置为RetentionPollcy.RUNTIME,那么在运行程序时,通过反射就可以获取相关的Annotation信息 ,如获取构造方法,字段和方法Annotation信息。

Cpmstructor类Field和Method类均继承了isAccessibleObject类,在AccessibleObject中定义了3个关于Annotation的放啊,其中,方法发isAnnotationPresent(Class<?extends Annotation>AnnotationClass)用来查看是否添加了指定类型的Annotation,如果是则返回true 否则返回false;方法getAnnotation(Class<T>AnnotationClass)用来获取指定类型的Annotation如果存在则返回相应的对象,则返回null方法getAnnotations()用来获取所有的Annotation改方法将返回Annotation数组

在constructor类和Method类中还定义了getParameterAnnotations()用来获得所有参数添加Annotation,将以Annotation可u下的二位数组返回,在数组中的素和顺序与声明的顺序相同。如果没有参数则返回一个长度为0的数组,如果存在未添加的Annotation的参数将用一个长度为0的嵌套数组占位

 

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值