注解 如何自定义注解 注解的解析
什么是注解?
package com.bjsxt.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 注解的作用 * 1.可以解释程序含义 * 2.被其他程序使用 * 注解的格式: * "@注解名" 还可以加参数值 * 比如 * @Override 注解 首字母大写 表示重写父类方法 * @Deprecated 废弃的 过时的 不建议使用的 * @SuppressWarnings(value="unchecked") * 自定义注解: * @Target(value={ElementType.METHOD,ElementType.TYPE}) * 可以看源文件 TYPE类型里面是枚举类型 里面 有 类 包 成员变量 局部变量 等等类型 可以理解为全部类型 * @Retention(RetentionPolicy.RUNTIME)自定义一般都选 runtime * @Retention 保留 三个 范围 source源文件 class字节码文件 一般变压器用前面2个 runtime 运行时(通过反射读取)一般自定义用它 * * 注解在哪使用? * 可以在package,class,mthod,field等 相等于加了辅助信息 我们可以通过反射机制实现对这些元数据的访问 * @author Administrator * */ public class TestAnnotation { @Override //注解 首字母大写 表示重写父类方法 public String toString(){ return ""; } @Deprecated //废弃的 过时的 不建议使用的 public static void test001(){ System.out.println("ok"); } public static void main(String[] args) { //虽然是不建议使用 但是可以使用 test001(); } @SuppressWarnings("all") //忽略 警告 public static void test002(){ } }
如何自定义注解
package com.bjsxt.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义注解 * 元注解 :对注解进行解释 * 注解的作用 * 1.可以解释程序含义 * 2.被其他程序使用 * 注解的格式: * "@注解名" 还可以加参数值 * 比如 * @SuppressWarnings(value="unchecked") * @Target 注解的作用范围(可以修饰包, 类。接口,枚举 方法 成员变量 局部变量 参数) * @Target(value={ElementType.METHOD,ElementType.TYPE}) * 可以看源文件 TYPE类型里面是枚举类型 里面 有 类 包 成员变量 局部变量 等等类型 可以理解为全部类型 * @Retention(RetentionPolicy.RUNTIME)自定义一般都选 runtime * @Retention 保留 三个 范围 source源文件 class字节码文件 一般变压器用前面2个 runtime 运行时(通过反射读取)一般自定义用它 * * 注解在哪使用? * 可以在package,class,mthod,field等 相等于加了辅助信息 我们可以通过反射机制实现对这些元数据的访问 * * @author Administrator * */ @Target(value={ElementType.METHOD,ElementType.TYPE}) //可以看源文件 ElementType.METHOD方法 ElementType.TYPE型里面是枚举类型 里面 有 类 包 成员变量 局部变量 等等类型 可以理解为全部类型 @Retention(RetentionPolicy.RUNTIME) //自定义注解一般都选 runtime public @interface MyAnnotation01 { //参数信息 参数类型 参数名 //注解元素必须要有值 可以设置 默认返回值 String studentName() default ""; int age() default 0; int id() default -1;//-1表示不存在 String[]schools()default{"清华","北大"}; }
package com.bjsxt.annotation; /** * 使用我们自定义的注解 * @author Administrator * */ @MyAnnotation01 public class MyAnnotation01Test { @MyAnnotation01(age=19,studentName="老哥",id=1001,schools={"人大","北电"}) public void test(){ } }
什么是ORM
package com.bjsxt.annotation.orm; /** * * ORM(Object Ralationship Mapping) * 关系型数据库 * 类和表结构对应 属性和字段对应 对象和记录对应 * @author Administrator * */ @SxtTable("tb_student") public class SxtStudent { @SxtField(columName="id",type="int",length=10) private int id; @SxtField(columName="sname",type="varchar",length=10) private String studentName; @SxtField(columName="age",type="int",length=3) private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.bjsxt.annotation.orm; /** * 自定义注解table * * * ORM(Object Ralationship Mapping) * 关系型数据库 * 类和表结构对应 属性和字段对应 对象和记录对应 * * 1.定义注解 * 2.在类中使用注解 * 3.解析注解 */ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value={ElementType.TYPE}) //可以看源文件 ElementType.METHOD方法 ElementType.TYPE型里面是枚举类型 里面 有 类 包 成员变量 局部变量 等等类型 可以理解为全部类型 @Retention(RetentionPolicy.RUNTIME) //自定义注解一般都选 runtime public @interface SxtTable { String value(); }
package com.bjsxt.annotation.orm; /** * * ORM(Object Ralationship Mapping) * 关系型数据库 * 类和表结构对应 属性和字段对应 对象和记录对应 * * 自定义注解 * field属性 */ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value={ElementType.FIELD}) //可以看源文件 ElementType.METHOD方法 ElementType.TYPE型里面是枚举类型 里面 有 类 包 成员变量 局部变量 等等类型 可以理解为全部类型 @Retention(RetentionPolicy.RUNTIME) //自定义注解一般都选 runtime public @interface SxtField { // 表的字段名 String columName(); String type(); int length(); }
package com.bjsxt.annotation.orm; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.Iterator; /** * 使用反射读取注解的信息 模拟处理注解信息的流程 * @author Administrator * * * ORM(Object Ralationship Mapping) * 关系型数据库 * 类和表结构对应 属性和字段对应 对象和记录对应 */ public class Demo03 { public static void main(String[] args) { try { //获得该包下这个类所有信息 Class clazz=Class.forName("com.bjsxt.annotation.SxtStudent"); //获得该类的所有注解 Annotation[]annotation = clazz.getAnnotations(); for (Annotation a: annotation ) { System.out.println(a); } //获取类的指定注解 根据注解名获取注解 SxtTable st =(SxtTable) clazz.getAnnotation(SxtTable.class); System.out.println(st.value()); //获得类的属性的注解 Field f = clazz.getDeclaredField("studentName"); SxtField sxtField = f.getAnnotation(SxtField.class); System.out.println(sxtField.columName()+"--"+sxtField.type()+"--"+sxtField.length()); //跟着获得的表名 字段信息 拼出DDl语句 然后,使用JDBC执行这个sql在数据库 生成先关的表 } catch (Exception e) { e.printStackTrace(); } } }
posted on 2017-10-16 18:55 PoeticalJustice 阅读(9106) 评论(0) 编辑 收藏 举报