自定义JDK注解

什么是注解?

 Annotation是从JDK5.0开始引入的新技术。

Annotation的作用

 —不是程序本身,可以对程序作出解释(这一点,跟注释没什么区别)

 —可以被其他程序(如编译器)读取。注解信息处理流程,是注解和注释的重大区别。

     如果没有注解信息处理流程,则注解毫无意义。

Annnotation的格式

  —注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")

Annotation在哪里使用?

  —可以附加在package,class,method,field上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

JDK内置注解

注解使用Demo

package org.wrf.annotation;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * JDK内置注解 
 * Copyright © 2019 WRF. All rights reserved.
 * 功能描述:
 * @Override 	重写父类中的方法 
 * @Deprecated  已废弃,不建议使用
 * @SupperWarnings 抑制编译警告,可加参数(value={"unchecked","deprecation"}) 或 ("all")
 * @Package: org.wrf.annotation 
 * @author: knight   
 * @date: 2019年4月2日 下午5:36:09
 */

@SuppressWarnings("all")
public class Demo01 {
	@Override
	public String toString() {
		return super.toString();
	}
	@Deprecated
	public void test01() {
		System.out.println("this is test01");
	}
	
	
	public void test02() {
		List list=new ArrayList();
		List list2=new ArrayList();
		
	}
	
	
	public static void main(String[] args) {
		Demo01 d=new Demo01();
		System.out.println(d);
		d.test01();
		
	}

}

自定义注解

元注解

@Target

@Retention

package org.wrf.annotation;

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

/**
 * 自定义注解
 * Copyright © 2019 WRF. All rights reserved.
 * 功能描述:
 * @Package: org.wrf.annotation 
 * @author: knight   
 * @date: 2019年4月2日 下午8:17:21
 */
//定义注解的使用范围 METHOD方法 TYPE类,接口,枚举
@Target(value={ElementType.METHOD,ElementType.TYPE})
//定义注解的生命周期  SOURCE源代码有效 CLASS类有效  RUNTIME运行时有效(常用于反射)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	//定义注解的属性 返回值代表类型 可设置默认值 default
	String studentName() default "";
	int age() default 0;
	int id() default -1;
	//定义数组类型参数
	String [] schools() default {"清华大学","北京大学"};
	
}
package org.wrf.annotation;

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

/**
 * 自定义注解 
 * Copyright © 2019 WRF. All rights reserved.
 * 功能描述:
 * 当只有一个属性时 通常命名为value 且引用时可以省略
 * @Package: org.wrf.annotation 
 * @author: knight   
 * @date: 2019年4月2日 下午8:17:21
 */
//定义注解的使用范围 METHOD方法 TYPE类,接口,枚举
@Target(value={ElementType.METHOD,ElementType.TYPE})
//定义注解的生命周期  SOURCE源代码有效 CLASS类有效  RUNTIME运行时有效(常用于反射)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation2 {
	//定义注解的属性 返回值代表类型 可设置默认值 default
	String value();
	
	
}
package org.wrf.annotation;
/**
 * 使用自定义注解
 * Copyright © 2019 WRF. All rights reserved.
 * 功能描述:
 * @Package: org.wrf.annotation 
 * @author: knight   
 * @date: 2019年4月2日 下午8:20:26
 */
@MyAnnotation
public class Demo02 {
    @MyAnnotation(studentName="张三",age=12,id=1,schools={"麻省理工学院","哈佛大学"})
    public void test() {
        
    }
    
    
    @MyAnnotation2("hhhh")
    public void test02() {
        
    }

}


利用反射解析注解

package org.wrf.annotation;

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

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyField {
	String columnName();//字段名称
	String columnType();//字段类型
	int length();		//字段长度
}
package org.wrf.annotation;

@MyTable("tb_student")
public class MyStudent {
	@MyField(columnName="id",columnType="int",length=10)
	private Integer id;
	@MyField(columnName="name",columnType="varchar",length=10)
	private String name;
	@MyField(columnName="length",columnType="int",length=3)
	private Integer age;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "MyStudent [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
	
}
package org.wrf.annotation;

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

@Target(value=ElementType.TYPE)		//注解作用范围
@Retention(RetentionPolicy.RUNTIME)	//注解生命周期
public @interface MyTable {
	String value();
}

测试

package org.wrf.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

/**
 * 根据反射获取注解信息  模拟注解信息处理流程
 * Copyright © 2019 WRF. All rights reserved.
 * 功能描述:
 * @Package: org.wrf.annotation 
 * @author: knight   
 * @date: 2019年4月2日 下午9:43:25
 */
public class Demo03 {
	public static void main(String[] args) throws NoSuchFieldException, SecurityException {
		try {
			//反射获取类的结构
			Class<?> clazz = Class.forName("org.wrf.annotation.MyStudent");
			//获取加载类的所有注解
			Annotation[] annotations = clazz.getAnnotations();
			for(Annotation a:annotations) {
				System.out.println(a);
			}
			//根据类的名称获取注解
			MyTable myTable = clazz.getAnnotation(MyTable.class);
			System.out.println(myTable.value());
			
			//根据类的属性获取注解
			Field f=clazz.getDeclaredField("name");
			MyField myFiled = f.getAnnotation(MyField.class);
			System.out.println(myFiled.columnName()+"-->"+myFiled.columnType()+"-->"+myFiled.length());
			
			/*
			至此已经获取表名,字段名 字段类型 字段长度
			可以使用三方工具生成或SQL语句创建表格
			*/
			
		
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		
		
		
		
		
	}
}

Annotation全部源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值