• 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对象的一个数组

  • 相关阅读:
    学习笔记:松弛
    学习笔记:可持久化线段树
    poj 3784 Running Median
    学习笔记:树状数组
    poj 2823 Sliding Window 题解
    学习笔记:状态压缩DP
    学习笔记:单调队列
    C++ 竞赛常用头文件
    mongodb lock 出毛病时解决方法
    ag使用需要注意的问题
  • 原文地址:https://www.cnblogs.com/KL2016/p/15932641.html
Copyright © 2020-2023  润新知