自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。以上所有例子都属于自定义注解。自定义注解具有以下固定格式:

public @interface 注解名{注解体}

所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组

注意:只能有public或默认(default)这两个访问权修饰,参数成员只能用以上6种类型,如果只有一个参数成员,最好把参数名称设为”value”。

Shade 形状注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Shade {

public enum ShadeType {
Triangle("三角"),
Four("四边"),
Five("五角");

private String type;

ShadeType(String type) {
this.type = type;
}

@Override
public String toString() {
return type;
}
}

public ShadeType shader() default ShadeType.Triangle;

}

读取注解

这里我们将使用反射去读取注解。Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个方法:

default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

<T extends Annotation> T getAnnotation(Class<T> var1);

返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

Annotation[] getAnnotations();

返回该程序元素上存在的所有注解。

Annotation[] getDeclaredAnnotations();

返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

public static void getInfo(Class<?> clazz) {
// 获取该类所有声明的方法
Field[] fields = clazz.getDeclaredFields();

if (fields == null) return;

for (Field field : fields) {

if (field.isAnnotationPresent(Mode.class)) {
Mode m0 = field.getAnnotation(Mode.class);
System.out.println("****name=" + m0.value());
}

if (field.isAnnotationPresent(Shade.class)) {
Shade s0 = field.getAnnotation(Shade.class);
System.out.println("****shade=" + s0.shader().toString());
}

if (field.isAnnotationPresent(People.class)) {
People p0 = field.getAnnotation(People.class);
System.out.println("****name=" + p0.Name() + "**age=" + p0.Age() + "**price=" + p0.Price());
}
}

}

使用自定义注解:

public class User {

@Mode(value = "小石头")
public String name;

@Shade(shader = Shade.ShadeType.Five)
public String shape;

@People(Age = 18, Price = 100f, Name = "小宝")
public int profile;

}

运行:

getInfo(User.class);

打印:

****name=小石头 ****shade=五角 ****name=小宝**age=18**price=100.0

自定义注解
自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。以上所有例子都属于自定义注解。自定义注解具有以下固定格式:

public @interface 注解名{注解体}

所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组

注意:只能有public或默认(default)这两个访问权修饰,参数成员只能用以上6种类型,如果只有一个参数成员,最好把参数名称设为”value”。

Shade 形状注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Shade {

public enum ShadeType {
Triangle("三角"),
Four("四边"),
Five("五角");

private String type;

ShadeType(String type) {
this.type = type;
}

@Override
public String toString() {
return type;
}
}

public ShadeType shader() default ShadeType.Triangle;

}

读取注解

这里我们将使用反射去读取注解。Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个方法:

default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

<T extends Annotation> T getAnnotation(Class<T> var1);

返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

Annotation[] getAnnotations();

返回该程序元素上存在的所有注解。

Annotation[] getDeclaredAnnotations();

返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

public static void getInfo(Class<?> clazz) {
// 获取该类所有声明的方法
Field[] fields = clazz.getDeclaredFields();

if (fields == null) return;

for (Field field : fields) {

if (field.isAnnotationPresent(Mode.class)) {
Mode m0 = field.getAnnotation(Mode.class);
System.out.println("****name=" + m0.value());
}

if (field.isAnnotationPresent(Shade.class)) {
Shade s0 = field.getAnnotation(Shade.class);
System.out.println("****shade=" + s0.shader().toString());
}

if (field.isAnnotationPresent(People.class)) {
People p0 = field.getAnnotation(People.class);
System.out.println("****name=" + p0.Name() + "**age=" + p0.Age() + "**price=" + p0.Price());
}
}

}

使用自定义注解:

public class User {

@Mode(value = "小石头")
public String name;

@Shade(shader = Shade.ShadeType.Five)
public String shape;

@People(Age = 18, Price = 100f, Name = "小宝")
public int profile;

}

运行:

getInfo(User.class);

打印:

****name=小石头 ****shade=五角 ****name=小宝**age=18**price=100.0

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。以上所有例子都属于自定义注解。自定义注解具有以下固定格式:

public @interface 注解名{注解体}

所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组

注意:只能有public或默认(default)这两个访问权修饰,参数成员只能用以上6种类型,如果只有一个参数成员,最好把参数名称设为”value”。

Shade 形状注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Shade {

public enum ShadeType {
Triangle("三角"),
Four("四边"),
Five("五角");

private String type;

ShadeType(String type) {
this.type = type;
}

@Override
public String toString() {
return type;
}
}

public ShadeType shader() default ShadeType.Triangle;

}

读取注解

这里我们将使用反射去读取注解。Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个方法:

default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

<T extends Annotation> T getAnnotation(Class<T> var1);

返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

Annotation[] getAnnotations();

返回该程序元素上存在的所有注解。

Annotation[] getDeclaredAnnotations();

返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

public static void getInfo(Class<?> clazz) {
// 获取该类所有声明的方法
Field[] fields = clazz.getDeclaredFields();

if (fields == null) return;

for (Field field : fields) {

if (field.isAnnotationPresent(Mode.class)) {
Mode m0 = field.getAnnotation(Mode.class);
System.out.println("****name=" + m0.value());
}

if (field.isAnnotationPresent(Shade.class)) {
Shade s0 = field.getAnnotation(Shade.class);
System.out.println("****shade=" + s0.shader().toString());
}

if (field.isAnnotationPresent(People.class)) {
People p0 = field.getAnnotation(People.class);
System.out.println("****name=" + p0.Name() + "**age=" + p0.Age() + "**price=" + p0.Price());
}
}

}

使用自定义注解:

public class User {

@Mode(value = "小石头")
public String name;

@Shade(shader = Shade.ShadeType.Five)
public String shape;

@People(Age = 18, Price = 100f, Name = "小宝")
public int profile;

}

运行:

getInfo(User.class);

打印:

****name=小石头 ****shade=五角 ****name=小宝**age=18**price=100.0

java:注解(二)的更多相关文章

  1. Java注解(二):实战 - 直接使用对象列表生成报表

    通过对Java注解(一):介绍,思想及优点学习了解,相信大家对Java注解有一定程度的了解,本篇文章将实战项目中的应用来加深对Java注解的了解. 本实例实现根据指定字段的JavaBean,生成对应列 ...

  2. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  3. APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例

    前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...

  4. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  5. java注解(基础)

    一.认识注解 1.注解的定义: java提供了一种原程序中的元素关联任何信息和元数据的途径和方法. 2.学习注解的目的: (1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的) ...

  6. 使用Java注解来简化你的代码

         注解(Annotation)就是一种标签,可以插入到源代码中,我们的编译器可以对他们进行逻辑判断,或者我们可以自己写一个工具方法来读取我们源代码中的注解信息,从而实现某种操作.需要申明一点, ...

  7. 10分钟学会JAVA注解(annotation)

    (原) 先认识注解(Annotation) 定义类用class,定义接口用interface,定义注解用@interface 如public @interface AnnotationTest{} 所 ...

  8. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  9. Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  10. 理解Java注解类型

    一. 理解Java注解 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy ...

随机推荐

  1. rmmod: can't change directory to “3.4.79+”,no such file or directory

    直接在/lib/modules目录下,在该目录下建立3.4.79+这个文件夹即可

  2. 关于python的整形(int)自动转长整形(long)的问题

    有时需要访问某个接口,其中传入的整形参数可能比较长就会变成long,这时如果用str()的话‘L’就会被转化到字符串中,导致接口不能识别: 这种情况下应该优先使用json来转译,可以完美保持翻译pyt ...

  3. 解决ie8下页面刚出现时候的晃动问题

    出现这个问题的原因的页面的高度超过一屏,这个时候需要在开始的时候给 html,body {overflow:scroll;overflow-x:hidden}; 这样就可以解决这个问题了

  4. CODEVS【3372】选学霸

    题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...

  5. C#中的继承与覆盖

    原文发布时间为:2009-03-03 -- 来源于本人的百度文章 [由搬家工具导入] //using System;//using System.Collections.Generic;using S ...

  6. User Experience Collection

    about a data driven system front end: 1. about succeeded requests: they do not want to see alerts ab ...

  7. [LeetCode] Rotate List 单项链表旋转

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

  8. loj 6278 6279 数列分块入门 2 3

    参考:「分块」数列分块入门1 – 9 by hzwer 2 Description 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间加法,询问区间内小于某个值\(x\)的元素个数. 思 ...

  9. linux下解压zip文件

    linux下解压zip文件 linux自带的unzip命令可以解压windows下的zip格式的压缩文件. unzip命令 语法:unzip [选项] 压缩文件名.zip 各选项的含义分别为: -x ...

  10. 基址重定位表&.reloc节区

    第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x01 PE重定位 若加载的是DLL.SYS文件,且在ImageBase ...