Java注解和反射

注解:

  • Annotation是JDK5.0开始引入的新技术

  • 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息

  • 通过反射机制变成实现对这些元数据的控制

内置注解

  • @Override:定义在 java.lang.Override中,此注释只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明

  • @Deprecated:定义在java.lang.Deprecated中,此注释可以用于修饰方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险,或者存在更好的选择

  • @SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息,与前面的两个注释不同,你需要额外添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了。

  • @SuppressWarnings(“all”)

  • @SuppressWarnings(“unchecked”)

  • @SuppressWarnings(value={“unchecked”, “deprecation”})

元注解

元注解的作用就是负责注解其它注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其它annotation类型作说明。

这些类型和它们所支持的类在 java.lang.annotation包可以找到 @Target 、@Retention@Documented@Inherited

  • @Target:用于描述注解的使用范围,即:被描述的注解可以在什么地方使用

  • @Retention:表示需要什么保存该注释信息,用于描述注解的生命周期

  • 级别范围:Source < Class < Runtime

  • @Document:说明该注解被包含在java doc中

  • @Inherited:说明子类可以集成父类中的注解

定义注解

使用 @interface自定义注解时,自动继承了 java.lang.annotation.Annotation接口

@interface 用来声明一个注解,格式:public @interface 注解名 {定义内

/**

* 定义一个注解
 */
@Target(value={ElementType.METHOD, ElementType.TYPE})  // target表示我们注解应用的范围,在方法上,和类上有效
@Retention(RetentionPolicy.RUNTIME)   // Retention:表示我们的注解在什么时候还有效,运行时候有效
@Documented   // 表示说我们的注解是否生成在java doc中
@Inherited   // 表示子类可以继承父类的注解
@interface MyAnnotation {

    // 注解的参数:参数类型 + 参数名()
    String name() default "";

    int age() default 0;

    // 如果默认值为-1,代表不存在
    int id() default -1;

    String[] schools();
}

 

 

@interface 用来声明一个注解,格式:public @interface 注解名 {定义内

/** * 定义一个注解 */

@Target(value={ElementType.METHOD, ElementType.TYPE})  // target表示我们注解应用的范围,在方法上,和类上有效

@Retention(RetentionPolicy.RUNTIME)   // Retention:表示我们的注解在什么时候还有效,运行时候有效

@Documented   // 表示说我们的注解是否生成在java doc中

@Inherited   // 表示子类可以继承父类的注解
@interface MyAnnotation {

    // 注解的参数:参数类型 + 参数名()
    String name() default "";

    int age() default 0;

    // 如果默认值为-1,代表不存在
    int id() default -1;

    String[] schools();
}

 

反射机制

Java不是动态语言,但是Java可以称为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制来获取类似于动态语言的 特性。

反射机制运行程序在执行期借助于Reflection API 取的任何类内部的信息,并能直接操作任意对象的内部属性及方法。

Class c = Class.forName("java.lang.String")

反射相关的主要API

  • java.lang.Class:代表一个类

  • java.lang.reflect.Method:代表类的方法

  • java.lang.reflect.Field:代表类的成员变量

  • java.lang.reflect.Constructor:代表类的构造器

Class类常用的方法

  • ClassforName(String name):返回指定类name的Class对象

  • newInstance():调用缺省构造函数,返回Class对象的一个实例

  • getName():返回此Class对象所表示的实体(类,接口,数组或void)的名称

  • getSuperClass():返回当前Class对象的父类Class对象

  • getinterfaces():返回当前对象的接口

  • getClassLoader():返回该类的类加载器

  • getConstructors():返回一个包含某些Constructor对象的数组

  • getMethod(String name, Class… T):返回一个Method对象,此对象的形参类型为paramsType

  • getDeclaredFields():返回Field对象的一个数组

posted @   KLAPT  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示