java注解知识点

什么是注解

我自己的理解,注解就是对对象内的元素(方法、成员变量、类名等)添加解释。
注解分为:
在这里插入图片描述
1.jdk注解:
在这里插入图片描述
2.第三方注解:
Spring常用注解:https://www.cnblogs.com/xingzc/p/5777814.html
常见第三方注解:https://www.cnblogs.com/jeremy5810/p/7760153.html
3.自定义注解

为什么使用注解

注解的主要使用场景在框架中,通过注解,可以极大地增强代码的简洁性和灵活性,省去了复杂的配置文件。
1.生成文档,通过代码里标识的元数据生成javadoc文档。

2.编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。

3.编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。

4.运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

如何使用注解

以手写自动建表框架为例:
自定义三个注解:

//前四行是元注解
//表示该注解表示的注解的作用域
@Target(ElementType.TYPE)
//表示该注解是运行期注解(分为编译时注解、编译时注解和运行时注解)
@Retention(RetentionPolicy.RUNTIME)
//支持继承
@inherited
//支持doc化
@documented
//注解的关键字是@interface
public @interface Table {
	public String name();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {
	public String name();
	public int length();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
	public String name();
	public int length();
	public boolean isNull();
}

使用注解:


@Table(name="person")
public class Person {
	public Person(){};
	
	public Person(String name,int age){
		this.setAge(age);
		this.setName(name);
	}
	@PrimaryKey(name="id",length=10)
	private int id;
	@Column(name="name",length=20, isNull = false)
	private String name;
	@Column(name="age",length=20, isNull = false)
	private int age;
	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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

通过注解获取元素信息,自动生成建表语句:


public class SqlUtil {
	public SqlUtil(){};
	
	public SqlUtil(Class<?> obj){
		this.obj=obj;
	};
	private Class<?> obj;
	
	public String getTableName(){
		String TableName="";
		if(obj.isAnnotationPresent(Table.class)){
			Table annotation=obj.getAnnotation(Table.class);
			TableName=annotation.name();
		}
		return TableName;
	}
	
	public String createTable(){
		String tableName=getTableName();
		StringBuffer sb=new StringBuffer("");
		sb.append("CREATE TABLE IF NOT EXISTS ").append(tableName).append("(");
		Field[] fields=obj.getDeclaredFields();
		String str="";
		for (Field field : fields) {
			field.setAccessible(true);
			if(field.isAnnotationPresent(Column.class)){
				Column annotation=field.getAnnotation(Column.class);
				if(String.class.isAssignableFrom(field.getType())){
					String flag=annotation.isNull()==true?",":"NOT NULL,";
					str+=annotation.name()+" VARCHAR("+annotation.length()+") "+flag;
				}else{
					String flag=annotation.isNull()==true?",":"NOT NULL,";
					str+=annotation.name()+" INT("+annotation.length()+") "+flag;
				}
			}else{
				PrimaryKey annotation=field.getAnnotation(PrimaryKey.class);
				if(int.class.isAssignableFrom(field.getType())){
					str+=annotation.name()+" INT("+annotation.length()+") PRIMARY KEY AUTO_INCREMENT,";
				}
		}
		}
		str=str.substring(0,str.length()-1)+")";		
		sb.append(str);
		return sb.toString();
	}
	
	public Map<String,List<Object>> getInsertSql(Object o){
		StringBuffer sb=new StringBuffer();
		Map<String,List<Object>> map=new HashMap<String,List<Object>>();
		List<Object> list=new ArrayList<Object>();
		String tableName=getTableName();
		sb.append("INSERT INTO ").append(tableName).append("(");
		Field[] fields=obj.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			if(field.isAnnotationPresent(Column.class)){
				Column annotation=field.getAnnotation(Column.class);
				sb.append(annotation.name()).append(",");
				try {
					list.add(field.get(o));
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else{
				PrimaryKey annotation=field.getAnnotation(PrimaryKey.class);
				sb.append(annotation.name()).append(",");
				try {
					list.add(field.get(o));
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		sb.deleteCharAt(sb.length()-1);
		sb.append(") ").append("VALUES (");
		for(int i=0;i<fields.length;i++){
			sb.append("?,");
		}
		sb.deleteCharAt(sb.length()-1);
		sb.append(")");
		map.put(sb.toString(), list);
		return map;
	}
	
	public Map<String,List<Object>> getSelectSql(List<Object> require){
		StringBuffer sb=new StringBuffer();
		Map<String,List<Object>> map=new HashMap<String,List<Object>>();
		String tableName=getTableName();
		sb.append("SELECT * FROM ").append(tableName).append(" WHERE 1=1 ");
		for(int i=0;i<require.size();i++){
			sb.append("AND ").append(require.get(i)).append("=?,");
		}
		sb.deleteCharAt(sb.length()-1);
		map.put(sb.toString(), require);
		return map;
	}
}

注意:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
转自博客园每天1990:https://www.cnblogs.com/meitian/p/9048331.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值