java annotation(如何创建新的注解)小结
“注解”有三种
1:无实际参数,只有声明
2:只存在单一参数,有些像方法调用
3:有多个参数
标准的“注解”就先不总结了。
想总结一下《如何创建自己的注解》。有很多流行的框架都会用到,所以对以后的学习也会有帮助。
1.无实际参数,只有声明(表达某种含义)
import java.lang.annotation.Retention;
import java.lang.annotation.Target
import java.lang.annotation.RetentionPolicy; /*
* 独自开发的注解
* @auther Z,wk
* @version 1.0
*
*/ @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SampleRequired{
}
2.有单一参数或多个参数
package sample; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//ElementType.TYPE 类的定义
@Target({
ElementType.TYPE,
ElementType.FIELD,
ElementType.CONSTRUCTOR,
ElementType.METHOD
})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
String value();
//此处还可以继续添加
//String value2();
}
3.使用方法
package sample; import java.util.ArrayList;
import java.util.List;
// ElementType.TYPE :添加到类或接口的定义上
@Info("SampleClass1 Info")
public class SampleClass1 { private List list; public SampleClass1(){ } @Override
public boolean equals(Object obj){
return list.equals(obj);
}
// ElmentType.Method:添加到方法声明上
@Info("hogehoge")
public void initList(){
list = new ArrayList();
list.add(10);
} }
package sample;
@Info("Sample2 class")
public class SampleClass2 {
//ElementType.FIELD : 添加到成员变量上
@Info("foo field")
private Foo foo;
//ElementType.CONSTRUCTOR : 添加到构造方法上
@Info("default constract")
public SampleClass2(){
foo = new Foo();
}
// ElementType.METHOD : 添加到方法声明上
@Info("bar method")
public void bar() {
foo.bar();
}
}
4. 取得调用“注解”的对象(笔者理解为:很多框架使用注解的意义所在)
package sample; import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class Client {
public static void main(String[] args){
System.out.println("start annotation sample");
SampleClass1 sc1 = new SampleClass1();
SampleClass2 sc2 = new SampleClass2(); //取得指定的“注解”
Annotation annotList[] = Info.class.getAnnotations();
System.out.println("annotation size is [" + annotList.length + "]");
for(int i=0; i<annotList.length; i++){
Annotation anno = annotList[i];
System.out.println(" annotation class is [" + anno.annotationType().getName() + "]");
} /****取得带有注解的CLASS****/
//SampleClass1
Annotation annotList1[] = SampleClass1.class.getAnnotations();
System.out.println("SampleClass1's annotation size is [" + annotList1.length + "]");
for(int i=0; i<annotList1.length; i++){
Annotation anno1 = annotList1[i];
System.out.println(" annotation class is [" + anno1.annotationType().getName() + "]");
}
//SampleClass2
Annotation annotList2[] = SampleClass2.class.getAnnotations();
System.out.println("SampleClass2's annotation size is [" + annotList2.length + "]");
for(int i=0; i<annotList2.length; i++){
Annotation anno2 = annotList2[i];
System.out.println(" annotation class is [" + anno2.annotationType().getName() + "]");
}
System.out.println();
System.out.println(); /****取得带有注解的METHOD****/
//SampleClass1
Method methodList1[] = SampleClass1.class.getMethods();
System.out.println("SampleClass1's method count is [" + methodList1.length + "]");
for(Method method : methodList1){
System.out.println(" method name is [" + method.getName() + "]");
for(Annotation annot : method.getAnnotations()){
System.out.println(" method annotation is [" + annot.annotationType().getName() + "]");
}
}
//SampleClass2
Method methodList2[] = SampleClass1.class.getMethods();
System.out.println("SampleClass2's method count is [" + methodList2.length + "]");
for(Method method : methodList2){
System.out.println(" method name is [" + method.getName() + "]");
for(Annotation annot : method.getAnnotations()){
System.out.println(" method annotation is [" + annot.annotationType().getName() + "]");
}
}
System.out.println();
System.out.println(); /****取得带有注解的FIELD(成员变量)****/
//SampleClass1
Field fieldList1[] = SampleClass1.class.getFields();
System.out.println("SampleClass1 has [" + fieldList1.length + "] fields");
for(Field field : fieldList1){
System.out.println(" field name is [" + field.getName() +"]");
for(Annotation annot : field.getAnnotations()){
System.out.println(" field annotation is [" + annot.annotationType().getName() + "]");
}
}
//SampleClass1
Field fieldList2[] = SampleClass2.class.getDeclaredFields();//getFields();
System.out.println("SampleClass2 has [" + fieldList2.length + "] fields");
for(Field field : fieldList2){
System.out.println(" field name is [" + field.getName() +"]");
for(Annotation annot : field.getAnnotations()){
System.out.println(" field annotation is [" + annot.annotationType().getName() + "]");
}
}
System.out.println();
System.out.println(); } }
本人属于初学者,有不对的地方希望过路的大神批评指正。
java annotation(如何创建新的注解)小结的更多相关文章
- java使用io创建文件与删除文件的工具类
java中对于文件的操作,是再常见不过了.以下代码是自己代码中所用到的工具类,仅供参考. import java.io.File; import java.io.IOException; /** * ...
- 第八篇:文件共享和使用 dup 函数创建新描述符的区别
前言 文件共享是指同时打开一个文件 用 dup 函数能对指定文件描述符再创建一个新的描述符,且这个新的描述符和旧的描述符指向的是同一个文件. 这两种行为有什么区别呢?下面给出的两张文件系统的图形象的解 ...
- Java Annotation 注解
java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- JAVA - Annotation 注解 入门
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- java Annotation 注解的使用
源码地址:https://github.com/yylxy/JavaAnnotationTest.git java Annotation 注解的使用 ,代码中有详细的注释.是用AndroidStudi ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
- 自己写的基于java Annotation(注解)的数据校验框架
JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方 ...
- Java并发包——使用新的方式创建线程
Java并发包——使用新的方式创建线程 摘要:本文主要学习了如何使用Java并发包中的类创建线程. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/ ...
随机推荐
- 华为云CodeArts Artifact,5大特性守护制品质量与安全
摘要:2023年2月23日,华为云CodeArts Artifact制品仓库服务正式上线,目标进一步赋能企业伙伴与开发者,实现软件作业中可信制品生产与应用活动快速落地,提高软件交付效率与质量. 本文分 ...
- CRT 与 exCRT
感觉网上很多写的都不是很清楚啊 awa. CRT 就是解这个方程 \(\begin{cases}x\equiv r_1 \pmod {m_1}\\ x\equiv r_2 \pmod {m_2} \\ ...
- 跳板攻击之:NPS代理转发
跳板攻击之:NPS代理转发 目录 跳板攻击之:NPS代理转发 1 NPS介绍 2 NPS特点 3 实验环境 3.1 实验准备 3.2 实验拓扑 3.3 NPS配置 3.3.1 conf/nps.con ...
- DBeaver连接clickhouse无法下载驱动的情况
最近遇到dbeaver 连接clickhouse的时候提示下载驱动失败. 在网上找了些方法也不行,其中包括默认下载.配置阿里云的Maven. 最后在网上找到一个驱动包,自己手动添加即可.把下载地址分享 ...
- nutGet操作数据库
在netcoe开发过程中,通过基建生成Razor页面增删改查,通过数据实例生成数据库时,不要手工修改数据库,而且通过程序包管理器控制台命令执行 1.没有数据库第一次新建的时候可以执行add-migra ...
- C语言学习--结构体指针
#include<stdio.h> #include<string.h> //结构体指针: 指针的类型为结构体 typedef struct nodeData { int a; ...
- 【7】java之正则表达式
一.正则标记 所有的正则可以使用的标记都在 java.util.regex.Pattern 类里定义. 1.1 单个字符 字符:表示由一位字符所组成: \\\\:表示转义字符"\\&qu ...
- No.2.3
PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心 手机屏幕小,网页宽度多数为100% 如何在电脑里面写代码边调试移动端网页效果? 谷歌模拟器 了解屏幕尺寸概念 屏幕尺寸:指的是屏幕对角线 ...
- MySQL5.7升级版本到8.0
升级二进制包安装的MySQL In-Place Upgrade(替代升级) 替代升级涉及到shutdown down旧版本的MySQL,用新版本的包替代旧版本的二进制包,用存在的数据文件目录重启MyS ...
- ACE下载地址
https://download.dre.vanderbilt.edu/previous_versions/ 在某n中找了大半天愣是没人贴出来