那就叫成效目的的范围,那就叫效率目的的界定

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

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

2. 注解的使用
  • 执行编写翻译期的反省 例如:@Override
  • 分析代码(重要用途:替代配置文件);
    写配置文件(xml), 声明开发(正是用注脚代替布署文件)
  • 实施编写翻译期的反省 例如:@Override
  • 剖析代码(首要用途:替代配置文件);
    写配置文件(xml), 评释开发(便是用表明代替安顿文件)

3. 定义注解类

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

4. 使用注解
  注解的作用目标:
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. 表明的脾性
  • 概念属性:

    • 格式:
    • 方法
    • 构造器
    • 参数
    • 有的变量
    • 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();
}
@interface MyAnno1 {
    int age();
    String name();
}
  • 利用注脚时给属性赋值
  • 运用声明时给属性赋值

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

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

  • 诠释属性的暗中认可值:在概念声明时,能够给注明钦点暗中认可值!
  • 诠释属性的暗许值:在概念注明时,能够给评释钦赐暗许值!

int age() default 100;

在行使注明时,能够不给带有默许值的性子赋值!

int age() default 100;

在利用申明时,能够不给带有暗许值的天性赋值!

  • 名为value的性质的特权
  • 名为value的脾性的特权

   当使用申明时,假使只给名为value的天性赋值时,能够归纳“value=”,

   当使用申明时,假诺只给名为value的性质赋值时,能够省略“value=”,

   例如: @MyAnno1(value=”hello”),能够书写成 @MyAnno1(“hello”)

   例如: @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;}

  • 诠释属性的门类
    • 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. 诠释的成效指标范围以及保存策略限定
  1. 注脚的功效目的范围以及保存策略限定

6.1
让二个表明,它的效果目的只万幸类上,不能够在点子上,那就叫作用目的的限量!

6.1
让多少个诠释,它的机能指标只幸亏类上,不可能在章程上,那就叫成效目的的限量!

  • 在概念表明时,给证明添加注明,这么些注明是@Target
  • 在概念评释时,给表明添加评释,这么些申明是@Target
@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@interface MyAnno1 {}
@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 {}
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 保留策略

6.2 保留策略

  • 源代码文件(SOUXC60CE):注明只在源代码中设有,当编译时就被忽略了
  • 字节码文件(CLASS):注明在源代码中留存,然后编写翻译时会把评释音信放到了class文件,但JVM在加载类时,会忽略注脚!
  • JVM中(RUNTIME):声明在源代码、字节码文件中设有,并且在JVM加载类时,会把注明加载到JVM内部存款和储蓄器中(它是绝无仅有可反射注脚!)
  • 源代码文件(SOU帕杰罗CE):表明只在源代码中设有,当编写翻译时就被忽略了
  • 字节码文件(CLASS):注明在源代码中存在,然后编写翻译时会把注脚消息放到了class文件,但JVM在加载类时,会忽视表明!
  • JVM中(RUNTIME):表明在源代码、字节码文件中留存,并且在JVM加载类时,会把注明加载到JVM内部存款和储蓄器中(它是绝无仅有可反射评释!)

  限定评释的保存策略

  限定评释的保存策略

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {}
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {}
  1. 诠释解析
  1. 评释解析

java.lang.reflect.AnnotatedElement

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接口.

  • 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;

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;

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());
  }

    //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”);

  @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());
  }
}

    // 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() { }
}

@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();
}

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