注解

匿名 (未验证) 提交于 2019-12-03 00:04:02

注解

  • 概念:
    • 说明程序的,jdk1.5之后
  • jdk中预定义的一些注解
    • @SuppressWarnings:压制警告
      • @SuppressWarnings("all"),压制所有警告
  • 自定义注解
    • 格式:
    • 本质:本质上是一个接口,该接口默认继承Annotation接口
      • 通过反编译可以知道:public interface myAnno extends java.lang.annotation.Annotation {}
    • 属性:接口中的抽象方法
      • 要求:
        • 1,属性的返回值类型有一下几种,其余不行
          • 基本数据类型
          • String
          • 枚举:赋值: = 枚举类名.value
          • @注解名
          • 以上类型的数组 = {value1,value2,...}
        • ,2,在使用定义的属性时,给属性赋值
          • 例如int age();使用时:@ano(age = 1);
          • 如果在注解内定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值
            • 例如int age()default 1;使用时:@ano();
          • 如果只有一个属性需要赋值,并且属性的名称是value则value可以省略,直接使用值
            • 例如int value();使用时:@ano(12);
          • 如果数组中只有一个值,{}可以省略
  • 元注解
    • :用于描述注解的注解
      • TYPE
        • :可以作用于类上,例:@Target(value = {ElementType.TYPE})//表示这个注解只能作用类上
      • METHOD
        • :可以作用于方法上
      • FIElD
        • :可以作用于成员变量上
      • RUNTIME
        • @Retention(RetentionPolicy.RUNTIME)//表示当前被描述的注解,会保留到class字节码文件中,并被jvm读取到
      • SOURCE:
        • 字节码文件都不会存在
      • ClASS:
        • 会被保留到字节码文件中,不会被jvm读取
  • 在程序中使用(解析)注解

注解解析

package cn.itcast.annotation;  import java.io.InputStream; import java.lang.reflect.Method; import java.util.Properties;  /**  * 框架类  */   @Pro(className = "cn.itcast.annotation.Demo1",methodName = "show") public class ReflectTest {     public static void main(String[] args) throws Exception {          /*             前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法          */           //1.解析注解         //1.1获取该类的字节码文件对象         Class<ReflectTest> reflectTestClass = ReflectTest.class;         //2.获取上边的注解对象         //其实就是在内存中生成了一个该注解接口的子类实现对象         /*              public class ProImpl implements Pro{                 public String className(){                     return "cn.itcast.annotation.Demo1";                 }                 public String methodName(){                     return "show";                 }              }  */          Pro an = reflectTestClass.getAnnotation(Pro.class);         //3.调用注解对象中定义的抽象方法,获取返回值         String className = an.className();         String methodName = an.methodName();         System.out.println(className);         System.out.println(methodName);              //3.加载该类进内存         Class cls = Class.forName(className);         //4.创建对象         Object obj = cls.newInstance();         //5.获取方法对象         Method method = cls.getMethod(methodName);         //6.执行方法         method.invoke(obj);     } }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!