打开 java注解 的"门户"

本文详细介绍如何在Java中创建并应用自定义注解,包括注解的生成、使用及通过反射获取注解内容的过程。从注解元注解的使用,到实际案例的解析,帮助读者理解注解在框架开发中的作用。

java注解的基础应用

注解

学过框架的大家都知道著名的Spring有很多经典的注解,比如层级注解:@Service、@Reponsitory、@Controller,以及Spring提供的IOC控制反转自动注入的注解:@Been、@Autowired 和Aop的注解:@Aspect、@Before、@After等等。注解的种类丰富多样,应用也极其方便,那么怎么做出属于自己的注解呢?

注解的生成

举例创建一个TypeAnnotation注解

@Target(ElementType.TYPE)
@Documented//说明该注解被包含在javadoc中
@Retention(RetentionPolicy.RUNTIME) // 保留时间,一般注解就是为了框架开发时代替配置文件使用,JVM运行时用反射取参数处理,所以一般都为RUNTIME类型
public @interface TypeAnnotation {
}

这里需要说明的是@Target注解,这是所创建的TypeAnnotation注解可以用在什么上面,大致提供了这几个可选项:

@Target(ElementType.TYPE)   //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR)  //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

如果设置完成后,就可以创建一个为此类增加功能的类了,可以用反射实现。

实际举例说明

  1. 创建FieldAnnotation注解,并声明此注解可以应用在字段、枚举、常量上,并提供jdbcType属性默认值是空。
		@Target({ElementType.FIELD})
		@Retention(RetentionPolicy.RUNTIME)
		public @interface FieldAnnotation {
		    public String jdbcType ()default "";
	}
  1. 在Testgeneric 类上使用,并对jdbcType 赋值
public class Testgeneric {
    @FieldAnnotation(jdbcType = "你好!!!如果喜欢的话请帮忙点个赞吧")
    public int id;
}
  1. 创建解析此注解的类TestgetZhujie,并通过query方法【反射】获取到使用类的对象来获取上面的注解内容
	public class TestgetZhujie {
	    public static void main(String[] args) {
	        Testgeneric a=new Testgeneric();         //使用类
	         a.setId(666);
	         query(a);
	    }
	    private static void query(Object f) {
	        //1.获取到class
	        Class c = f.getClass();
	        Field[] fArray = c.getDeclaredFields();
	        for (Field field : fArray) {
	            //4.处理每个字段对应的sql
	            //4.1.拿到的字段名上是否含有此注解
	            boolean fExists = field.isAnnotationPresent(FieldAnnotation.class);
	            if (!fExists) {
	                continue;
	            }
	            FieldAnnotation column = field.getAnnotation(FieldAnnotation.class);
	            String columnName = column.jdbcType();
	            System.out.println("注解参数:"+columnName);
	            //4.2.当然也可以拿它的值
		        try {
	                System.out.println(field.getName()+"值为:"+field.get(f));
	            } catch (IllegalAccessException e) {
	                e.printStackTrace();
	            }
	            
	        }
	    }
  1. 运行结果:
    在这里插入图片描述

感谢各位花时间访问,就先说到此处,谢谢大家支持

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值