java注解示例程序

MyAnno.java

package com.yawn.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({
	ElementType.METHOD, 
	ElementType.TYPE, 
	ElementType.FIELD, 
	ElementType.PARAMETER})
// 注解的生命周期(源码、编译时、运行时)
@Retention(RetentionPolicy.RUNTIME)
// 允许继承
@Inherited
// 生成javadoc时包含的注解的信息
@Documented
public @interface MyAnno {
	
	String desc() default "";
	String name();
	int age() default 18;
	
}

TestAnno.java

package com.yawn.annotation;

@MyAnno(name="yawn", desc="good boy")
public class TestAnno {
	
	@MyAnno(name="tempreture", desc="")
	private double tempreture;
	
	@MyAnno(name="iii")
	public String iii;
	
	@MyAnno(name="ageee")
	private Integer ageee;
	
	
	@MyAnno(name="method ", desc="desc")
	public void test(@MyAnno(name="id")String id, @MyAnno(name="size")int size){
		
		
	}

}

Test.java

package com.yawn.annotation;

import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

import org.junit.Before;

public class Test {
	
	Class<?> clazz;
	
	@Before
	public void before() throws ClassNotFoundException{
		clazz = Class.forName("com.yawn.annotation.TestAnno");
	}
	
	/*
	 * 类上的注解
	 */
	@org.junit.Test
	public void test(){
		printAnnoInfo(clazz);
	}
	
	/*
	 * 成员变量上的注解
	 */
	@org.junit.Test
	public void test2() throws ClassNotFoundException{
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			printAnnoInfo(field);
		}
	}
	
	/*
	 * 方法上的注解
	 */
	@org.junit.Test
	public void test3() throws ClassNotFoundException{
		Method[] methods = clazz.getDeclaredMethods();
		for (Method method : methods) {
			printAnnoInfo(method);
		}
	}
	
	/*
	 * 方法参数上的注解
	 */
	@org.junit.Test
	public void test4() throws ClassNotFoundException{
		Method[] methods = clazz.getDeclaredMethods();
		for (Method method : methods) {
			Parameter[] params = method.getParameters();
			for (Parameter parameter : params) {
				printAnnoInfo(parameter);
			}
		}
	}
	
	
	private void printAnnoInfo(AnnotatedElement element){
		if (element.isAnnotationPresent(MyAnno.class)) {
			MyAnno myAnno = element.getAnnotation(MyAnno.class);
			System.out.println("==> "+element.getClass());
			System.out.println("[name="+myAnno.name()+", age="+myAnno.age()+", desc="+myAnno.desc()+"]");
			System.out.println();
		}
	}

}

测试结果:

==> class java.lang.Class
[name=yawn, age=18, desc=good boy]

==> class java.lang.reflect.Field
[name=tempreture, age=18, desc=]

==> class java.lang.reflect.Field
[name=iii, age=18, desc=]

==> class java.lang.reflect.Field
[name=ageee, age=18, desc=]

==> class java.lang.reflect.Method
[name=method , age=18, desc=desc]

==> class java.lang.reflect.Parameter
[name=id, age=18, desc=]

==> class java.lang.reflect.Parameter
[name=size, age=18, desc=]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

数字的陷阱

Java中对数字的处理,如四舍五入,如加减乘除,貌似是一个很基础很简单的知识点,但是如果你没有对他进行充分了解,很容易掉进它的陷阱里。 1、浮点数运算 先来看一...

1868
来自专栏码匠的流水账

聊聊flink的BoltWrapper

flink-storm_2.11-1.6.2-sources.jar!/org/apache/flink/storm/wrappers/BoltWrapper....

982
来自专栏IMWeb前端团队

Nodejs进阶:核心模块Buffer常用API使用总结

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 Buffer是node的核心模块,开发者可以利用它来处理二进制数...

2129
来自专栏Android机动车

java进阶之自定义注解

博客: https://shuaijia.github.io/

1071
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第十节 simple-jdbc源码

39810
来自专栏码匠的流水账

聊聊storm WindowTridentProcessor的FreshCollector

本文主要研究一下storm WindowTridentProcessor的FreshCollector

743
来自专栏龙首琴剑庐

Java多态性的“飘渺之旅”

朵星人A:人类,是一个很奇妙的物种。 朵星人B:他们好像分为两种,嗯 先生,以及美女? 朵星人C:对,更年轻的有叫 美少女的。 朵星人D:他们之间怎么打招呼的?...

3647
来自专栏CaiRui

Python列表知识补充

1、import this  Python之禅,圣经。 >>> import this The Zen of Python, by Tim Peters Be...

1979
来自专栏菩提树下的杨过

java:POI导出excel

POI是一个开源项目,专用于java平台上操作MS OFFICE,企业应用开发中可用它方便导出Excel. 下面是使用示例: 1、maven中先添加依赖项 1 ...

2545
来自专栏专注研发

poj-1146 ID codes

It is 2084 and the year of Big Brother has finally arrived, albeit a century lat...

903

扫码关注云+社区