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 注解 Annotation

33613
来自专栏Android先生

Android-Annotation教你写自定义注解

地址:https://juejin.im/post/5a14158df265da432c237bfc

502
来自专栏拭心的安卓进阶之路

Java 进阶巩固:什么是注解以及运行时注解的使用

这篇文章 2016年12月13日星期二 就写完了,当时想着等写完另外一篇关于自定义注解的一起发。结果没想到这一等就是半年多 - -。 有时候的确是这样啊,总想着...

1916
来自专栏五毛程序员

java注解入门(含源码下载)

3365
来自专栏JMCui

Java 注解

    从JDK1.5开始,引入了源代码中的注解这一机制。注解使得 Java 源代码中不但可以包含功能性的实现代码,还可以包含元数据。

601
来自专栏代码拾遗

​Java 注解详解

注解是在Java 1.5之后引入的,为的是可以直接在代码中编写元信息。在注解发布之前,如果想要描述代码只能将其写入到其他文件中,例如xml。 注解可以应用于包,...

721
来自专栏微信公众号:Java团长

框架开发之Java注解的妙用

如果你还不会使用注解,你肯定不好意思对别人说你学过Spring,你学过Mybatis,因为它们用了大量的注解。可见注解在开发领域已经使用的非常广泛了。

711
来自专栏calmound

程序面试题

1已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串...

2646
来自专栏吴伟祥

注解(Annotation) 转

  注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是...

550
来自专栏androidBlog

注解使用入门(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

591

扫码关注云+社区