C++表明入门

1. 什么是注解
  语法:@注解名称
  注解的作用:替代xml配置文件!
    servlet3.0中,就可以不再使用web.xml文件,而是所有配置都使用注解!
  注解是由框架来读取使用的!

2. 注解的使用
  • 执行编译期的检查 例如:@Override
  • 分析代码(首要用途:替代配置文件);
    写配置文件(xml), 注脚开发(就是用申明代替计划文件)

3. 定义注解类

class A {}   //定义类
interface A{} //定义接口
enum A{}     //定义枚举
@interface A{}//所有的注解都是Annotation的子类!

4. 使用注解
  注解的作用目标:
    • 方法
    • 构造器
    • 参数
    • 局地变量
    • 1 package Demo;
      2
      3
      4 @MyAnno1
      5 public class Demo1 {
      6 @MyAnno1
      7 private String name;
      8
      9 @MyAnnol
      10 public Demo1(){ }
      11
      12 @MyAnnol
      13 public void fun1() { }
      14
      15 public void fun2(@MyAnno1 String name) {
      16 @MyAnnol
      17 String username = “hello”;
      18
      19 // @MyAnno1
      20 // System.out.println(“hello”);//报错
      21 }
      22 }
      23 //定义注解24 @interface MyAnno1 { }

    1. 诠释的属性
  • 概念属性:

    • 格式:
@interface MyAnno1 {
    int age();
    String name();
}
  • 应用表明时给属性赋值

@MyAnno1(age=100, name=”zhangSan”)

  • 表明属性的默许值:在概念声明时,能够给表明指定暗许值!

int age() default 100;

在动用注明时,可以不给带有暗许值的性情赋值!

  • 名为value的品质的特权

   当使用注明时,即使只给名为value的特性赋值时,能够大致“value=”,

   例如: @MyAnno1(value=”hello”),可以挥洒成 @MyAnno1(“hello”)

  • 诠释属性的类型
    • 8种基本类型
    • String
    • Enum
    • Class
    • 评释类型
    • 上述品种的一维数组类型
  • 当给数组类型的习性赋值时,若数组成分的个数为1时,可以回顾大括号

    1 @MyAnno1(
    2 a=100,
    3 b=”hello”,
    4 c=MyEnum1.A,
    5 d=String.class,
    6 e=@MyAnno2(aa=100,bb=”world”),
    7 f={“a1″,”a2”})
    8 public class Demo3 { }
    9
    10 @interface MyAnno1 {
    11 int a();
    12 String b();
    13 MyEnum1 c();
    14 Class d();
    15 MyAnno2 e();
    16 String[] f();
    17 }
    18 @interface MyAnno2 {
    19 int aa();
    20 String bb();
    21 }
    22 enum MyEnum1{A,B,C;}

  1. 表明的效率目的限制以及保存策略限定

6.1
让三个评释,它的效果目的只可以在类上,不大概在方式上,那就叫功能目的的限制!

  • 在概念注脚时,给表明添加评释,这些注明是@Target
@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@interface MyAnno1 {}
1 import java.lang.annotation.ElementType;
2 import java.lang.annotation.Target;
3 
4 @MyAnno1
5 public class Demo4 {}
6 @Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
7 @interface MyAnno1 {}

6.2 保留策略

  • 源代码文件(SOU哈弗CE):表明只在源代码中留存,当编译时就被忽略了
  • 字节码文件(CLASS):表明在源代码中设有,然后编译时会把阐明音信放到了class文件,但JVM在加载类时,会忽视表明!
  • JVM中(RUNTIME):注脚在源代码、字节码文件中设有,并且在JVM加载类时,会把表明加载到JVM内存中(它是绝无仅有可反射阐明!)

  限定评释的保存策略

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {}
  1. 声明解析

java.lang.reflect.AnnotatedElement

  • T getAnnotation(Class<T>annotationType):得到指定项目标声明引用。没有回到null。

  • Annotation[]
    getAnnotations():得到全体的声明,包罗从父类继承下去的。

  • Annotation[]
    getDeclaredAnnotations():拿到协调身上的诠释。

  • boolean
    isAnnotationPresent(Class<?extends Annotation>
    annotationType)
    :判断指定的笺注有没有。

    Class、Method、Field、Constructor等落成了AnnotatedElement接口.

import org.junit.Test;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

public class Demo {
  @Test
  public void fun1() {
    //1. 得到效用目的
    Class<A> c = A.class;

    //2. 获取指定项目标评释
    MyAnno1 myAnno1 = c.getAnnotation(MyAnno1.class);
    System.out.println(myAnno1.name() + “, “
      + myAnno1.age() + “, ” + myAnno1.sex());
  }

  @Test
  public void fun2() throws SecurityException, NoSuchMethodException
{
    //1. 得到成效目标
    Class<A> c = A.class;
    Method method = c.getMethod(“fun1”);

    // 2. 获得指定项目标笺注
    MyAnno1 myAnno1 = method.getAnnotation(MyAnno1.class);
    System.out.println(myAnno1.name() + “, “
      + myAnno1.age() + “, ” + myAnno1.sex());
  }
}

@MyAnno1(name=”A类”, age=1, sex=”男”)
class A {
  @MyAnno1(name=”fun1方法”, age=2, sex=”女”)
  public void fun1() { }
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {
  String name();
  int age();
  String sex();
}