0

この列挙型を操作して、新しい素材を追加しようとしています。まだ削除されていないものは、他の場所に強い依存関係があります。それでも、これは mods の作成者によると Java のバイト制限にほぼ達しているため、とにかく作業する余地はあまりありません。

GregoriousT は次のように述べています。

私たちが話している列挙型: http://pastebin.com/g0aJ2Qjd

だから私はただ尋ねます、これについてどうすればいいですか?

[FML]: 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 これは、クライアントがクラッシュする前に私の現在の試行がスローするものです。(ログコードは読みやすいように削除されています)

現在の試行:

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]; 
java.lang.reflect.Method[] methods = con.getClass().getDeclaredMethods();
for (java.lang.reflect.Method m1 : methods) { 
    if (m1.getName().equals("acquireConstructorAccessor")) { 
        m1.setAccessible(true);
        m1.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);
Materials v = (Materials) m.invoke(ca, new Object[] { new Object[] { "NEWMATERIAL", Integer.MAX_VALUE } }); 
System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal());}}

Forge IRC の連中もよくわかりませんでした。

4

1 に答える 1

2

JVM は、このような卑劣なenumインスタンスの作成を防ぐことになっています。したがって、すぐに解決される可能性のある欠陥を使用するか、JRE を非常に深くハッキングして、わずかな変更で壊れる可能性があるかのいずれかを行う必要があります。

これは、Oracle の現在の JRE 8、おそらく JRE 7 でも機能するトリックで、驚くほど簡単です。

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Constructor;
import java.util.EnumSet;

public class EnumHack {
    public static void main(String[] args) throws Throwable {
        Constructor<Thread.State> c
            = Thread.State.class.getDeclaredConstructor(String.class, int.class);
        c.setAccessible(true);
        MethodHandle h=MethodHandles.lookup().unreflectConstructor(c);
        Thread.State state=(Thread.State)h.invokeExact("FLYING", 42);
        System.out.println("created Thread.State "+state+"("+state.ordinal()+')');
        System.out.println(EnumSet.allOf(Thread.State.class).contains(state));
    }
}

しかし、この解決策が続くとは思わないでください…</p>

于 2016-01-22T21:16:54.163 に答える