什么是注解?
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(); } } }