標籤:依賴 1.2 equals 資料 span warning equal instance enum
一:反射(Reflect)1.1、概要
概要:動態擷取類的資訊,以及動態調用對象的方法的功能(運行時獲得並使用類的資訊的方法叫反射)
1.2、主要功能
主要功能:
-
- 在運行時判斷任意一個對象所屬的類;
- 在運行時構造任意一個類的對象;
- 在運行時判斷任意一個類所具有的成員變數和方法;
- 在運行時調用任意一個對象的方法
1.3、Class
class的解釋:
-
- class 定義類的關鍵字
- class 每個類都具備的class靜態屬性
- Class類 描述類的類型資訊
1.4、反射常用方法
獲得Class的方法
| 通過對象獲得 |
對象.getClass() |
| 通過字串獲得(包名+類名) |
Class.forName(“包名.類名”) |
| 通過類的靜態成員獲得Class |
類名.class |
| 只針對內建的基礎資料型別 (Elementary Data Type)(String為引用資料類型) |
基礎資料型別 (Elementary Data Type)的參考型別.TYPE 如:Integer.Type |
其它方法
| 獲得自己的所有欄位 |
Field[] field=class.getDeclaredFields(); |
| 獲得所有public的欄位(包括父類的) |
Field[] field=class.getFields(); |
| 獲得方法(根據方法名) |
class.getMethod("方法名"); |
| 調用方法 |
method.invoke(對象,有參數加參數); |
| 獲得執行個體對象 |
class.newInstance |
| 設定私人欄位可以訪問 |
class.setAccessible(true); |
二:反射應用情境三:註解3.1、註解的定義
Java 註解就像修飾符一樣,可以用於從java代碼中抽取文檔、跟蹤代碼中的依賴性或者在編譯時間做檢查。註解可以被應用在包、類、方法、成員變數、參數和本地變數的聲明中。我們大多數人最先接觸的註解就是@Override。
註解的工作原理就是,先使用註解修飾java代碼,然後另一塊叫做註解處理器的代碼會解析這段註解和被修飾的代碼並做相應的處理。
3.2、內建註解
1.)Override
java.lang.Override是一個標記類型註解,它被用作標註方法。它說明了被標註的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種註解在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。
2.)Deprecated
Deprecated也是一種標記類型註解。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標註的程式元素。所以使用這種修飾具有一定的“延續性”:如果我們在代碼中通過繼承或者覆蓋的方式使用了這個過時的類型或者成員,雖然繼承或者覆蓋後的類型或者成員並不是被聲明為@Deprecated,但編譯器仍然要警示。
3.)SuppressWarnings
SuppressWarning不是一個標記類型註解。它有一個類型為String[]的成員,這個成員的值為被禁止的警告名。對於javac編譯器來講,被-Xlint選項有效警告名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。
@SuppressWarnings("unchecked")
3.3、元註解(註解的註解)
java.lang.annotation提供了四種元註解,專門註解其他的註解(在自訂註解的時候,需要使用到元註解):
@Documented –註解是否將包含在JavaDoc中
@Retention –什麼時候使用該註解
@Target –註解用於什麼地方
@Inherited – 是否允許子類繼承該註解
四:自訂註解
自訂註解類編寫的一些規則:
1. Annotation型定義為@interface, 所有的Annotation會自動繼承java.lang.Annotation這一介面,並且不能再去繼承別的類或是介面。
2. 參數成員只能用public或預設(default)這兩個訪問權修飾
3. 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基礎資料型別 (Elementary Data Type)和String、Enum、Class、annotations等資料類型,以及這一些類型的數組.
4. 要擷取類方法和欄位的註解資訊,必須通過Java的反射技術來擷取 Annotation對象,因為你除此之外沒有別的擷取註解對象的方法
5. 註解也可以沒有定義成員,自訂註解需要使用到元註解
案例:
package Annotation;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.FIELD,ElementType.TYPE})@Inheritedpublic @interface Ailas { public String value() default ""; public boolean isGenerator() default false; public boolean isNull() default true; public boolean isPrimary() default false;}五:反射結合註解
產生簡單的SQL指令碼
package Annotation;import java.lang.reflect.Field;public class CreateSQLScript { public static void main(String[] mag) throws Exception { System.out.println("查詢:"+creteSelectScript("Fruits")); System.out.println("修改:"+creteUpdateScript("Fruits")); System.out.println("刪除:"+creteDeleteScript("Fruits")); System.out.println("添加:"+creteInsertScript("Fruits")); System.out.println("建立:"+creteTableScript("Fruits")); } public static String creteSelectScript(String clas) throws Exception { String SqlSelect = "select "; Class clazz = Class.forName("reflect." + clas + ""); Field[] fields = clazz.getDeclaredFields(); String temp = ""; for (Field f : fields) { SqlSelect += temp + f.getName(); temp = ","; } SqlSelect += " form"; Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class); if (classAlias != null) { //獲得註解中value的值 SqlSelect += " " + classAlias.value(); } else { SqlSelect += " " + clazz.getSimpleName(); } return SqlSelect; } public static String creteUpdateScript(String clas) throws Exception { Class clazz = Class.forName("reflect." + clas + ""); String sql = "update ";// UPDATE student SET Sname="李軍" WHERE Sno="101" Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class); if (classAlias != null) { //獲得註解中value的值 sql += " " + classAlias.value() + " "; } else { sql += " " + clazz.getSimpleName() + " "; } Field[] fields = clazz.getDeclaredFields(); sql += " set "; String temp = ""; String primary=""; for (Field f : fields) { Ailas fieldAlias = f.getDeclaredAnnotation(Ailas.class); if(fieldAlias!=null){ if(fieldAlias.isPrimary()){ primary=f.getName(); continue; } } sql += temp + f.getName() + "=?"; temp = ","; } sql += " where " + primary + "=?"; return sql; } public static String creteDeleteScript(String clas) throws Exception { Class clazz = Class.forName("reflect." + clas + ""); String sql = " DELETE FROM ";// DELETE FROM fruits WHERE name="西瓜" Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class); if (classAlias != null) { //獲得註解中value的值 sql += " " + classAlias.value() + " "; } else { sql += " " + clazz.getSimpleName() + " "; } Field[] fields = clazz.getDeclaredFields(); sql += " form "; sql += " where " + fields[0].getName() + "=?"; return sql; } public static String creteInsertScript(String clas) throws Exception { Class clazz = Class.forName("reflect." + clas + ""); String sql = " insert into";// insert into Student(Sno,Sname,Ssex,Sbirthday,Class) values(‘108‘,‘曾華‘,‘男‘,‘1977-09-01‘,‘95033‘); Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class); if (classAlias != null) { //獲得註解中value的值 sql += " " + classAlias.value() + "("; } else { sql += " " + clazz.getSimpleName() + "("; } Field[] fields = clazz.getDeclaredFields(); String temp = ""; for (Field f : fields) { sql += temp + f.getName() + " "; temp = ","; } sql += ")values("; temp = ""; for (Field f : fields) { sql += temp + "?"; temp = ","; } sql += ")"; return sql; } public static String creteTableScript(String clas) throws Exception { Class clazz = Class.forName("reflect." + clas + ""); String sql = " create table ";// /* create table Student /*學生表*/// (//// Sno Char(3) not null primary key, /*學號(主碼)*///// Sname Char (8) not null, /*學生姓名*///// Ssex Char(2) not null, /*學生性別*///// Sbirthday datetime, /*學生出生年月*/// class Char (5) /*學生所在班級*///)*/ Ailas classAlias = (Ailas) clazz.getDeclaredAnnotation(Ailas.class); if (classAlias != null) { //獲得註解中value的值 sql += " " + classAlias.value() + "("; } else { sql += " " + clazz.getSimpleName() + "("; } Field[] fields = clazz.getDeclaredFields(); String temp = ""; for (Field f : fields) { String[] type = f.getType().toString().split("[.]"); sql += temp + f.getName() + " "; if (type[(type.length) - 1].equals("String")) { sql += "varchar"; } else if (type[(type.length) - 1].equals("double")) { sql += "Money"; } else if (type[(type.length) - 1].equals("Date")) { sql += "datetime"; } Ailas fieldAlias = (Ailas) f.getDeclaredAnnotation(Ailas.class); if (fieldAlias != null) { if (!fieldAlias.isNull()) { sql += " not null"; } if (fieldAlias.isPrimary()) { sql += " primary key "; } } temp = ","; } sql += ")"; return sql; }}
Java課外拓展-----反射與註解