枚舉類&&註解&&反射
- 2019 年 10 月 6 日
- 筆記
什麼是枚舉類?
枚舉類是優化定義固定對象的一種特殊的類。
換句話說,在需要類的實例為一個或者多個並且相對固定的時候,使用枚舉類。(枚舉類可擴展)
類的實例相對來說固定的有日期,客觀不變的一些數字等等。
enum WorkDay { MONDAY, THUEDAY, WEDNESDAY , THURSDAY , FRIDAY; } public class Main { public static void main(String[] args) { System.out.println("Hello World!"); WorkDay workDay; workDay=WorkDay.MONDAY; //WorkDay實例化的workday值限定在周一到周五之間 // workDay=3; //編譯報錯 WorkDay []workDays = WorkDay.values(); //返回枚舉類型的對象數組 for(int i =0;i<workDays.length;i++) { System.out.println(workDays[i]); } /** * 單例模式是枚舉類的特例,單例模式的要求是一個類只能由一個實例對象。 * 枚舉類的使用是定義類時固定其一個或多個對象 * * 枚舉類的特點: * - 類型安全(枚舉類的定義就是固定的) * - 枚舉類的對象自動添加private static final * - 某種程度的解耦,枚舉類可以加一組常量或者對象抽離出主程式,減小類之間的耦合性。在枚舉類模板的擴展上也更加容易 */ } }
註解
Annotation 其實就是程式碼里的特殊標記, 這些標記可以在編譯, 類加 載, 運行時被讀取, 並執行相應的處理。
註解本質是一個介面和一組鍵值對,通過反射和代理實現某種行為。
【框架 = 註解 + 反射 + 設計模式。】
/** * @author shkstart * @version 1.0 * */ public class Main { /** * 程式的主方法,程式的入口 * @param args String[] 命令行參數 */ @SuppressWarnings("unused") //抑制編譯器警告 int a = 10; @Deprecated //用於表示所修飾的元素(類, 方法等)已過時。通常是因為所修飾的結構危險或存在更好的選擇 public void print(){ System.out.println("過時的方法"); } @Override //限定重寫父類方法, 該註解只能用於方法 public String toString() { return "重寫的toString方法()"; } public static void main(String[] args) { } /** * 求圓面積的方法 * @param radius double 半徑值 * @return double 圓的面積 */ public static double getArea(double radius){ return Math.PI * radius * radius; } }
反射
什麼是反射?
反射機制允許程式在運行期 藉助於Reflection API取得任何類的內部資訊,並能直接操作任意對象的內部屬性及方法。 (最高許可權)
Object類
package java.lang; public class Object { private static native void registerNatives(); static { registerNatives(); } public final native Class<?> getClass(); public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } protected native Object clone() throws CloneNotSupportedException; public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException; public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0) { timeout++; } wait(timeout); } public final void wait() throws InterruptedException { wait(0); } protected void finalize() throws Throwable { } }
其中有一個這樣的方法
public final native Class<?> getClass();
獲取Class類的實例
- 若已知具體的類,通過類的class屬性獲取,該方法最為安全可靠, 程式性能最高
- 已知某個類的實例,調用該實例的getClass()方法獲取Class對象
- 已知一個類的全類名,且該類在類路徑下,可通過Class類的靜態方 法forName()獲取,可能拋出ClassNotFoundException Class test = String.class; Class test01 = "Hello World!".getClass(); Class test02 = Class.forName("java.lang.String"); //拋異常
所有的類都繼承Object,所以String.class返回類的實例。
Class類里有一個forName的方法,返回值也為Class:

獲取類的資訊,調用類的屬性及方法
package test; import java.lang.reflect.Field; import java.lang.reflect.Method; class Work { private String name; private Integer age; private String gender; private String job; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } @Override public String toString() { return "Work{" + "name='" + name + ''' + ", age=" + age + ", gender='" + gender + ''' + ", job='" + job + ''' + '}'; } } public class ReflectWork { public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException { Class classWork = Class.forName("test.Work"); System.out.println(" ///獲取所有方法資訊" ); Method []methods= classWork.getDeclaredMethods(); for (Method m:methods) { System.out.println(m.toString()); } System.out.println(" //獲取所有成員屬性資訊"); Field[] field=classWork.getDeclaredFields(); for(Field f:field){ System.out.println(f.toString()); f.setAccessible(true); //取消類的私有屬性的訪問許可權控制 System.out.println(f.getName().toString()); } System.out.println("//通過反射初始化"); Work reflectWork = (Work) classWork.newInstance(); reflectWork.setAge(22); reflectWork.setJob("Dev"); Work work = reflectWork; System.out.println(work); } }
