java:注解(二)
自定义注解
使用@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:注解(二)的更多相关文章
- Java注解(二):实战 - 直接使用对象列表生成报表
通过对Java注解(一):介绍,思想及优点学习了解,相信大家对Java注解有一定程度的了解,本篇文章将实战项目中的应用来加深对Java注解的了解. 本实例实现根据指定字段的JavaBean,生成对应列 ...
- 19.Java 注解
19.Java注解 1.Java内置注解----注解代码 @Deprecated //不推荐使用的过时方法 @Deprecated ...
- APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例
前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...
- 框架基础——全面解析Java注解
为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...
- java注解(基础)
一.认识注解 1.注解的定义: java提供了一种原程序中的元素关联任何信息和元数据的途径和方法. 2.学习注解的目的: (1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的) ...
- 使用Java注解来简化你的代码
注解(Annotation)就是一种标签,可以插入到源代码中,我们的编译器可以对他们进行逻辑判断,或者我们可以自己写一个工具方法来读取我们源代码中的注解信息,从而实现某种操作.需要申明一点, ...
- 10分钟学会JAVA注解(annotation)
(原) 先认识注解(Annotation) 定义类用class,定义接口用interface,定义注解用@interface 如public @interface AnnotationTest{} 所 ...
- java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...
- Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- 理解Java注解类型
一. 理解Java注解 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy ...
随机推荐
- 习题:烽火传递(DP+单调队列)
烽火传递[题目描述]烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有n个烽火台,每个烽火台 ...
- 【bzoj3280】小R的烦恼 费用流
题目描述 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项邪恶的实验来证明P=N ...
- String.intern() (jdk1.8)
1.通过字面量赋值创建字符串 (如:String str=”aaa”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串:若不存在,则在常量池中生成一个字符串,再将栈中 ...
- Manacher--雾窗寒对遥天暮,暮天遥对寒窗雾
POJ 3974: Palindrome 题意: 最长回文子串的长度... 分析: Manacher板子题... 代码: #include<algorithm> #include<i ...
- HDU 4487 Maximum Random Walk
Maximum Random Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- spfa代码
先来贴一下,,虽然不是自己写的 #include<iostream>#include<cstdio>#include<cstring>#include<cma ...
- 自动合并多个文件如js css等 可以增加效率
原文发布时间为:2011-01-13 -- 来源于本人的百度文章 [由搬家工具导入] 原文地址:http://www.codeproject.com/KB/aspnet/HttpCombine.asp ...
- [论文]A Link-Based Cluster Ensemble Approach for Categorical Data Clustering
http://www.cnblogs.com/Azhu/p/4137131.html 这篇论文建议先看了上面这一遍,两篇作者是一样的,方法也一样,这一片论文与上面的不同点在于,使用的数据集是目录数据, ...
- 多线程设计模式 - Future模式
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...
- linux 常用命令: basename 去掉路径和扩展名
basename: 去掉路径和扩展名 /bin/basename coreutils-8.4-9.el6.x86_64 basename命令用于去掉路径信息,返回纯粹的文件名,如果指定的文件的扩展 ...