vendredi 22 janvier 2016

Creating and overriding Java Enum Objects at Runtime [GregTech/minecraft]

I'm trying to work with this enum and add new materials. Anything not already removed has hard dependencies elsewhere, even still, this is nearly at the java byte limit according to the mods author so there isn't really a lot of room to work with anyway.

GregoriousT mentioned "There is one way. Overmind hacked the Enum using Reflection to add his own stuff. No Idea how he did that and also no idea how long he takes to reply to things if you ask him."

Enum we're talking about: http://ift.tt/1Vdg2kS

So I simply ask, how would I go about this?

This is my current attempt and I get thrown [20:46:38] [Client thread/WARN] [FML]: MiscUtils: Logging Value for Variable m:1|newInstance|public java.lang.Object sun.reflect.DelegatingConstructorAccessorImpl.newInstance(java.lang.Object[]) throws java.lang.InstantiationException,java.lang.IllegalArgumentException,java.lang.reflect.InvocationTargetException|false before the client crashes.

Current attempt:

public class MaterialsNew {

public static void getGregMaterials() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, SecurityException{
Utils.LOG_WARNING("Stepping through the process of Greg's materials.");

    Constructor<?> con = Materials.class.getDeclaredConstructors()[0]; 
    Utils.LOG_WARNING("Logging Value for Variable "+"Constructor"+":"+con.getName());
java.lang.reflect.Method[] methods = con.getClass().getDeclaredMethods();
Utils.LOG_WARNING("Logging Value for Variable "+"methods"+":"+methods.toString());
for (java.lang.reflect.Method m1 : methods) { 
    Utils.LOG_WARNING("Logging Value for Variable "+"m1"+":"+m1.getName()+"| Accessible? "+m1.isAccessible());
    if (m1.getName().equals("acquireConstructorAccessor")) { 
        Utils.LOG_WARNING("Logging Value for Variable "+"m1"+":"+m1.getName()+"| Accessible? "+m1.isAccessible());
        m1.setAccessible(true);
        Utils.LOG_WARNING("Logging Value for Variable "+"m1"+":"+m1.toGenericString());
        m1.invoke(con, new Object[0]);}
} 
Field[] fields = con.getClass().getDeclaredFields(); 
Utils.LOG_WARNING("Logging Value for Variable "+"fields"+":"+fields.toString()+"|"+fields.getClass());
Object ca = null;
for (Field f : fields) { 
    Utils.LOG_WARNING("Logging Value for Variable "+"f"+":"+f.getName()+"|"+f.getModifiers()+"|"+f.isAccessible());
    if (f.getName().equals("constructorAccessor")) {
    Utils.LOG_WARNING("Logging Value for Variable "+"f"+":"+f.isAccessible());
    f.setAccessible(true); 
    ca = f.get(con); 
    Utils.LOG_WARNING("Logging Value for Variable "+"ca"+":"+ca.toString()+"|"+ca.getClass());
    } 
} 
Method m = ca.getClass().getMethod( "newInstance", new Class[] { Object[].class }); 
Utils.LOG_WARNING("Logging Value for Variable "+"m"+":"+m.getModifiers()+"|"+m.getName()+"|"+m.toGenericString()+"|"+m.isAccessible());
m.setAccessible(true);
Materials v = (Materials) m.invoke(ca, new Object[] { new Object[] { "NEWMATERIAL", Integer.MAX_VALUE } }); 
System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal());}}

Any help or suggestions appreciated, they guys over at the Forge IRC weren't really sure either.





Aucun commentaire:

Enregistrer un commentaire