java自定义注解及实例

java自定义注解及实例

  • 目录
    • 说明
    • 项目结构
    • 注解定义
    • 自定义表注解@Table>>Table.java
    • 自定义字段注解@Field>>Field.java
    • 实体类User.java
    • 测试方法dao_text.java
    • 总结

目录

说明

内容主要是如何自定义注解(可以配合反射使用)

项目结构

图片:java自定义注解及实例_第1张图片

注解定义

代码片.

package 注解;

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.CONSTRUCTOR,//构造方法
	ElementType.FIELD,//字段
	ElementType.LOCAL_VARIABLE,//局部变量
	ElementType.METHOD,//方法
	ElementType.PACKAGE,//包
	ElementType.PARAMETER,//参数
	ElementType.TYPE//类、接口
	})

//生命周期(三选一)
@Retention(
/*		RetentionPolicy.SOURCE,//源码
		RetentionPolicy.CLASS,//编译
*/
		RetentionPolicy.RUNTIME//运行时
		)
//是否允许继承,有此注解就允许子类继承父类上的注解(只能在类上)
@Inherited 

//生成文件javadoc,会包含注解
@Documented
public @interface 注解名 {
	//定义注解成员,无参,无异常
	//成员类型只能是基本类型+String+Class+Annotation+Enumeration
	//当成员只有一个时,名字只能是value(),在使用时可以不指定成员名。
	String deac();
	String author();
	int age() default 18;//初始化成员的值
}

说明:
有五个部分

自定义表注解@Table>>Table.java

代码片.

package 注解;

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

//定义用在类上的运行时的表格注解
//只有一个成员
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
	String value();
}

自定义字段注解@Field>>Field.java

代码片.

package 注解;

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 Field {
	String value();
}

实体类User.java

代码片.

package entity;

import 注解.Field;
import 注解.Table;

//实体类
@Table("user")
public class User {
	
	@Field("id")
	private int id;
	
	@Field("name")
	private String name;
	
	@Field("password")
	private String password;
	
	public User(int id, String name, String password) {

		this.id=id;
		this.name=name;
		this.password=password;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
	}	
}

测试方法dao_text.java

使用注解+反射机制完成实体对象和表的映射,类似hibernate注解,代码片.

package DAO;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import entity.User;
import 注解.Table;

public class dao_text {

	public static void main(String[] args) {

		User user=new User(1,"小明","123");
		System.out.println(user.toString());
		
		//用注解实现,写出插入数据库的SQL语句
		//用反射机制获取user字段上的注解值,组成一个SQL语句
		
		Class<? extends User> c=user.getClass();//获得user类对象,是属于user的类对象
		
		boolean b=c.isAnnotationPresent(Table.class);//判断c上是否有注解@Table
		if(!b){
			return;
		}
		
		Table table=(Table) c.getAnnotation(Table.class);//获得注解实例
		String tableName=table.value();//获得注解值---表名
		System.out.println(">表名"+tableName);
		
		Field[] fields=c.getDeclaredFields();//获得c上的所以字段
		for(Field f :fields){
			
			boolean bf=f.isAnnotationPresent(注解.Field.class);//判断字段上是否有注解Field
			if(!bf){
				continue;
			}
			
			注解.Field fie=f.getAnnotation(注解.Field.class);//获得注解实例
			String fieName=fie.value();//获得注解值--表字段名
			
			String fieldName=f.getName();//获得字段名
			
			String getName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);//获得字段的get方法名
			Object fieldValue=null;
			try {
				
				Method method=c.getMethod(getName);//获得字段get方法对象
				
				fieldValue=method.invoke(user);//执行方法,获得字段值
				
				System.out.print(">>>属性名:"+fieldName+";表字段名:"+fieName+";属性值/-/表字段值:"+fieldValue);
				
				if(fieldValue instanceof String){
					System.out.println(";值是字符串类型的");
				}else if (fieldValue instanceof Integer) {
					System.out.println(";值是int类型的");
				}
			} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}		
		}
	}
}

总结

	1. 注解可以很好的简化编程。
	2. 注解可以用于传值。
	3. 注解配合反射机制,力量无穷啊。
**引用包是最大的困难(一步一步来)**

你可能感兴趣的:(java注解)