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 条评论
登录 后参与评论

相关文章

来自专栏ml

mybatis 对于基本类型数据传值的问题

最近在开发的时候,遇到一个小问题: Caused by: org.apache.ibatis.reflection.ReflectionException: T...

4186
来自专栏猿天地

反射面试题-请了解下

反射就是动态加载对象,并对对象进行剖析。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获...

823
来自专栏java 成神之路

spring bean 基于xml的4中初始化方法

2729
来自专栏码匠的流水账

聊聊rocketmq的ProducerImpl

io/openmessaging/rocketmq/producer/ProducerImpl.java

381
来自专栏用户画像

Struts2_三种传参数方法

2、通过域模型传参数(Domain Model) UserAction.java

463
来自专栏技术小黑屋

Code Snippet for Media on Android

A few days ago,I have wrote down this post http://androidyue.github.io/blog/2014...

491
来自专栏Hongten

HIbernate 中的 继承映射

数据库中Delivery表:id,recipient,phone,address,postcode,delivery_type,parcel_number,ex...

301
来自专栏代码拾遗

​反射基础之Enum

因为枚举也是一个类,所以也可以通过Field,Method,Constructor的反射API获取其他信息:

693
来自专栏测试开发架构之路

注解与依赖注入

1.Product package com.how2java.pojo; import org.springframework.beans.factory.a...

2816
来自专栏QQ音乐技术团队的专栏

ContentProvider 引发闪退之谜

CP 在跨进程调用的场景中,作为数据提供的进程称作 Server 进程,请求数据的进程称作 Client 进程。当我们享受它在跨进程场景下带来的便利时,可能未曾...

3490

扫描关注云+社区