Конечно можно! «Да! Да! Ктулху Фтхагн! Ph'nglui mglw'nfah Ктулху Р'лех вгх'нагл фхтагн !!»
Оригинальная идея: "http://www.theserverside.com/news/thread.tss?thread_id=50190"
Уничтожьте реальность на свой страх и риск.
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
enum ThingsThatShouldNotBe {
;
public void HelloWorld() {
System.out.println(this.name() + " Says Hello!");
}
public static void main(String[] args) throws Exception {
Constructor<?> con = ThingsThatShouldNotBe.class.getDeclaredConstructors()[0];
Method[] methods = con.getClass().getDeclaredMethods();
for (Method m : methods) {
if (m.getName().equals("acquireConstructorAccessor")) {
m.setAccessible(true);
m.invoke(con, new Object[0]);
}
}
Field[] fields = con.getClass().getDeclaredFields();
Object ca = null;
for (Field f : fields) {
if (f.getName().equals("constructorAccessor")) {
f.setAccessible(true);
ca = f.get(con);
}
}
Method m = ca.getClass().getMethod("newInstance",
new Class[] { Object[].class });
m.setAccessible(true);
ThingsThatShouldNotBe v = (ThingsThatShouldNotBe) m.invoke(ca, new Object[] { new Object[] { "Cthulhu",
Integer.MAX_VALUE } });
System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal());
System.out.println("Say hello Cthulhu!");
v.HelloWorld();
}
}
Мву ХА ХА ХА ХА ХА ХА.
Если вам действительно нужен Enum, и вы хотите, чтобы у него были методы экземпляра, и вы решили призвать старших богов отражения, чтобы навязать миру эту мерзость, тогда это полезно .
Это определенно запутает других разработчиков позже.