zoukankan      html  css  js  c++  java
  • 注解

    注解

    • 概念:
      • 说明程序的,jdk1.5之后
    • jdk中预定义的一些注解
      • @override :检测该注解标注的方法是否是继承自父类(接口)的
      • @Deprecated : 该注解标注的内容,表示已过时
      • @SuppressWarnings:压制警告
        • @SuppressWarnings("all"),压制所有警告
    • 自定义注解
      • 格式:
        • public @interface 注解名称{ 属性列表 }
      • 本质:本质上是一个接口,该接口默认继承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);
            • 如果数组中只有一个值,{}可以省略
    • 元注解
      • :用于描述注解的注解
      • @Target 描述注解能够作用的位置
        • TYPE
          • :可以作用于类上,例:@Target(value = {ElementType.TYPE})//表示这个注解只能作用类上
        • METHOD
          • :可以作用于方法上
        • FIElD
          • :可以作用于成员变量上
      • @Retention :描述注解能被保留的阶段
        • RUNTIME
          • @Retention(RetentionPolicy.RUNTIME)//表示当前被描述的注解,会保留到class字节码文件中,并被jvm读取到
        • SOURCE:
          • 字节码文件都不会存在
        • ClASS:
          • 会被保留到字节码文件中,不会被jvm读取
      • @Documented :描述注解是否能被抽取到api文档中
      • @Inherited :描述注解是否被子类继承
    • 在程序中使用(解析)注解

    注解解析

    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);
        }
    }
  • 相关阅读:
    大数据测试2
    大数据测试3
    CROSS APPLY和 OUTER APPLY 区别详解
    SQL中的escape的用法
    Sql Server参数化查询之where in和like实现详解
    多行文本框换行符处理
    Cross Apply的用法
    交叉连接Cross Join的用法
    统计字符串中某个字符的个数
    JOIN用法
  • 原文地址:https://www.cnblogs.com/lsswudi/p/11517341.html
Copyright © 2011-2022 走看看