“注解”有三种

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. pip和pipenv简记

    一. pip篇 1. 配置文件换源 windows:C:\Users\Administrator\pip\pip.ini mac:~/pip/pip.conf [global] index-url = ...

  2. LG P2633 Count on a tree

    \(\text{Solution}\) 树上主席树板子 \(\text{Code}\) #include <cstdio> #include <algorithm> #defi ...

  3. JZOJ 5355. 【NOIP2017提高A组模拟9.9】保命

    题目 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄做一些防火措施,保障自己.猫.奶牛的生命安全. 农夫约的农庄里有N+1 座建筑,排成了一排,编号为0-N.对于0 < ...

  4. 【ACR2015】持续临床缓解的RA患者能停用TNF拮抗剂吗?

    标签: 类风湿关节炎; 药物减停; 生物制剂; 减停后复发 荷兰一项随机对照试验显示, 已获持续6个月临床缓解或低疾病活动度的RA患者在停用TNFi的6个月内约三分之一病情复发 Moghadam HG ...

  5. .net 移动mas短信接口开发

    接口文档下载 1.移动后台接入用户新增(选择HTTP协议) 2.后台代码 /// <summary>    /// 用户名    /// </summary>    priva ...

  6. 基于PostGIS使用GeoServer发布数据量大的GPS轨迹路线图

    1. 引言 人类在行走或者驾驶过程中产生的GPS轨迹,是道路的一种采样,根据GPS轨迹路线,我们可以推知道路的存在,根据轨迹的密度,可以推知道路的热度以及重要性.如何才能在地图中显示大量的轨迹,这是一 ...

  7. 【C/C++】main函数中的argc和argv

    1.简述argc和argv 当你用命令行执行文件时,可在后面接指令,以控制程序的运行 argc(argument counter)表示指令的数量 argv(argument vector)表示指令向量 ...

  8. pip 基本问题

    pip语法错误 pip换源 更新错误 无模板 Ignoring警告 问题一 (pip语法错误 ) pip list File "<stdin>", line 1 pip ...

  9. golang输出字母a-z

    方法1: func main() { for i := 0; i < 10; i++ { ss := 'a' + i fmt.Printf("==%c", ss) } }

  10. 在Linux中实现打印目录程序遇到问题及解决

    今日阅读Linux程序设计第四版时,书中给出了一段实例代码,功能为实现/home目录下各级目录结构,当然不一定非得是/home下目录才可以,任何一级目录都可以. 自己尝试在Ubuntu系统运行编译,实 ...