java注解知识点

it2022-05-09  41

什么是注解

我自己的理解,注解就是对对象内的元素(方法、成员变量、类名等)添加解释。 注解分为: 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)