自定义注解

使用@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. BZOJ 1497 最大获利(最大权闭合图)

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 4686  Solved: 2295 [Submit][Statu ...

  2. 简单的log

    简单的方法想日志中追加内容 public static void updateSql(string Name,string str) { FileStream fs = new FileStream( ...

  3. bzoj 3704 昊昊的机油之GRST 贪心dp,思维

    昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MBSubmit: 80  Solved: 33[Submit][Status][Discuss] ...

  4. 很好用的取代 PuTTY 的SSH远程登陆软件 Termius

    一直以来, 我都是用 PuTTY 一个窗口一个窗口来监视我所有的远程服务器. putty-connections-on-a-screen 总感觉非常的不方便, 特别是当远程链接断开需要再重新打开PUT ...

  5. 洛谷 P1072 Hankson 的趣味题

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  6. set基本用法---1

    #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #inclu ...

  7. [CODEVS1130]数字反转

    题目描述 Description 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零. 这是一道水题.我必须 ...

  8. C#、.Net学习资料免注册下载基地。。。

    原文发布时间为:2008-11-28 -- 来源于本人的百度文章 [由搬家工具导入] http://club.topsage.com/forumdisplay.php?fid=121&filt ...

  9. apscheduler定时器

    每天定时任务: import time from apscheduler.schedulers.background import BackgroundScheduler def foo(): pri ...

  10. hdu 2685(数论相关定理+欧几里德定理+快速取模)

    I won't tell you this is about number theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...