随笔 - 296,  文章 - 0,  评论 - 7,  阅读 - 50万

自定义注解

使用@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

posted on   Mr.He多多指教  阅读(196)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示