资料博客参考: 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方法不是目标方法");
}
}
}