“注解”有三种

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(如何创建新的注解)小结的更多相关文章

  1. java使用io创建文件与删除文件的工具类

    java中对于文件的操作,是再常见不过了.以下代码是自己代码中所用到的工具类,仅供参考. import java.io.File; import java.io.IOException; /** * ...

  2. 第八篇:文件共享和使用 dup 函数创建新描述符的区别

    前言 文件共享是指同时打开一个文件 用 dup 函数能对指定文件描述符再创建一个新的描述符,且这个新的描述符和旧的描述符指向的是同一个文件. 这两种行为有什么区别呢?下面给出的两张文件系统的图形象的解 ...

  3. Java Annotation 注解

    java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...

  4. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  5. JAVA - Annotation 注解 入门

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  6. java Annotation 注解的使用

    源码地址:https://github.com/yylxy/JavaAnnotationTest.git java Annotation 注解的使用 ,代码中有详细的注释.是用AndroidStudi ...

  7. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  8. python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

    python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

  9. 自己写的基于java Annotation(注解)的数据校验框架

    JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方 ...

  10. Java并发包——使用新的方式创建线程

    Java并发包——使用新的方式创建线程 摘要:本文主要学习了如何使用Java并发包中的类创建线程. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/ ...

随机推荐

  1. 华为云CodeArts Artifact,5大特性守护制品质量与安全

    摘要:2023年2月23日,华为云CodeArts Artifact制品仓库服务正式上线,目标进一步赋能企业伙伴与开发者,实现软件作业中可信制品生产与应用活动快速落地,提高软件交付效率与质量. 本文分 ...

  2. CRT 与 exCRT

    感觉网上很多写的都不是很清楚啊 awa. CRT 就是解这个方程 \(\begin{cases}x\equiv r_1 \pmod {m_1}\\ x\equiv r_2 \pmod {m_2} \\ ...

  3. 跳板攻击之:NPS代理转发

    跳板攻击之:NPS代理转发 目录 跳板攻击之:NPS代理转发 1 NPS介绍 2 NPS特点 3 实验环境 3.1 实验准备 3.2 实验拓扑 3.3 NPS配置 3.3.1 conf/nps.con ...

  4. DBeaver连接clickhouse无法下载驱动的情况

    最近遇到dbeaver 连接clickhouse的时候提示下载驱动失败. 在网上找了些方法也不行,其中包括默认下载.配置阿里云的Maven. 最后在网上找到一个驱动包,自己手动添加即可.把下载地址分享 ...

  5. nutGet操作数据库

    在netcoe开发过程中,通过基建生成Razor页面增删改查,通过数据实例生成数据库时,不要手工修改数据库,而且通过程序包管理器控制台命令执行 1.没有数据库第一次新建的时候可以执行add-migra ...

  6. C语言学习--结构体指针

    #include<stdio.h> #include<string.h> //结构体指针: 指针的类型为结构体 typedef struct nodeData { int a; ...

  7. 【7】java之正则表达式

    一.正则标记 ​ 所有的正则可以使用的标记都在 java.util.regex.Pattern 类里定义. 1.1 单个字符 字符:表示由一位字符所组成: \\\\:表示转义字符"\\&qu ...

  8. No.2.3

    PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心 手机屏幕小,网页宽度多数为100% 如何在电脑里面写代码边调试移动端网页效果? 谷歌模拟器 了解屏幕尺寸概念 屏幕尺寸:指的是屏幕对角线 ...

  9. MySQL5.7升级版本到8.0

    升级二进制包安装的MySQL In-Place Upgrade(替代升级) 替代升级涉及到shutdown down旧版本的MySQL,用新版本的包替代旧版本的二进制包,用存在的数据文件目录重启MyS ...

  10. ACE下载地址

    https://download.dre.vanderbilt.edu/previous_versions/ 在某n中找了大半天愣是没人贴出来