資料博客參考: http://blog.csdn.net/w172087242/article/details/51262474
所有包名都被我去掉了,處於無包結構。
接口代碼如下:
public interface Business {
/**
* 執行業務
*/
void run();
}
枚舉代碼如下:
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
/**
* 枚舉進階篇,單例,反射
* @author littlehow
*
*/
public enum BusinessEnum implements Business{
/**
* 買車,最多不能超過40萬元
*/
Singleton("奧迪", 400_000);
/**
* 業務名稱
*/
private String name;
/**
* 最大存儲,練習業務,無具體效果
*/
private int max;
/**
* 初始化時間
*/
private long initTime;
private BusinessEnum(String name, int max) {
this.name = name;
this.max = max;
this.initTime = System.currentTimeMillis();
}
/**
* 獲取業務名稱
* @return
*/
public String getName() {
return name;
}
/**
* 獲取最大錢數
* @return
*/
public int getMax() {
return max;
}
/**
* 獲取初始化時間
* @return
*/
public long getInitTime() {
return initTime;
}
@Override
public void run() {
System.out.println("我想要買一輛["+this.name+"], 預算不超過["+this.max +"]元");
}
@Override
public String toString() {
return this.name;
}
/**
* 業務調用
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws Exception {
System.out.println("啓動時間[" + System.currentTimeMillis() + "]");
TimeUnit.MILLISECONDS.sleep(10);//沉沉的睡去10毫秒吧
/** 獲取任務 */
Business business = Singleton;
TimeUnit.MILLISECONDS.sleep(10);//沉沉的睡去10毫秒吧
System.out.println("啓動時間[" + System.currentTimeMillis() + "]");
/** 執行業務 */
business.run();//我想要買一輛[奧迪], 預算不超過[400000]元
/** 獲取實例初始時間
* 最後發現在main方法之初,枚舉對象就已經實例化了
* */
System.out.println("實例時間[" + ((BusinessEnum)business).getInitTime() + "]");
try {
business = (Business)BusinessEnum.class.newInstance();
} catch (Exception e) {
/**
* 異常堆棧(因爲枚舉不能被反射實例化):
* java.lang.InstantiationException: BusinessEnum
* at java.lang.Class.newInstance(Class.java:364)
* at BusinessEnum.main(BusinessEnum.java:..)
*/
e.printStackTrace();
}
TimeUnit.SECONDS.sleep(1);//沉沉的睡去一秒吧
/** 獲取類型 */
Class<?> clazz = business.getClass();
/** 輸出類型 */
System.out.println(clazz);//class BusinessEnum
/** 獲取其修飾符 */
int modifiers = clazz.getModifiers();
System.out.println(modifiers);//16401
/** 轉換成二進制輸出
* 從我的另外一篇博客可以知道,枚舉類型都是final的
* http://blog.csdn.net/w172087242/article/details/51262474
* 用於修飾枚舉類型的爲 100000000000000=16384 = 0x00004000
* */
System.out.println(Integer.toBinaryString(modifiers));//100000000010001
/** 判斷是否爲枚舉 */
System.out.println(clazz.isEnum());//true
/** 獲取父類 class java.lang.Enum */
System.out.println(clazz.getSuperclass());
/** 根據反射實例化枚舉對象 */
Method valueOf = clazz.getDeclaredMethod("valueOf", String.class);
/** 輸出public static BusinessEnum BusinessEnum.valueOf(java.lang.String)
* 可以看出是static的
* */
System.out.println(valueOf);
boolean staticflag = (8 & valueOf.getModifiers()) == 8;
System.out.println(staticflag);//true
if (staticflag) {//靜態的纔不需要實例來調用
BusinessEnum businessNew = (BusinessEnum)valueOf.invoke(null, "Singleton");
/** 驗證是否爲單例,發現時間與上面的初始化時間一致 */
System.out.println(businessNew.getInitTime());
/**
* 執行業務
* 我想要買一輛[奧迪], 預算不超過[400000]元
*/
businessNew.run();
} else {
/** 枚舉類型都會有這樣的方法,只能重載,不能覆蓋,所以不用擔心會出現非static的valueOf(String) */
System.out.println("非靜態的valueOf方法不是目標方法");
}
}
}