Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM

Skyriiy

Mitglied
Hallo liebes Forum,
ich bin neu im Thema ASM und versuche mit dem folgenden Code eine unbekannte bzw vom Nutzer definierte menge an Variablen in meine Klasse "ItemList" hinzufügen zu lassen. Hierzu verwende ich for-loops und eine statische variable welche die Anzahl der hinzuzufügenden Felder enthält.

Java:
protected static byte[] write() {
        ClassWriter cw = new ClassWriter(0);
        FieldVisitor fv;
        MethodVisitor mv;

        cw.visit(52, ACC_PUBLIC + ACC_SUPER, "de/blutmondgilde/ibocore/item/ItemList", null, "java/lang/Object", null);
        cw.visitSource("ItemList.java", null);
        cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC);

        {
            fv = cw.visitField(ACC_PRIVATE + ACC_FINAL + ACC_STATIC, "ITEM_REGISTRY", "Lnet/minecraftforge/registries/DeferredRegister;", "Lnet/minecraftforge/registries/DeferredRegister<Lnet/minecraft/item/Item;>;", null);
            fv.visitEnd();
        }
        {
            fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "TEST_ITEM", "Lnet/minecraftforge/fml/RegistryObject;", "Lnet/minecraftforge/fml/RegistryObject<Lnet/minecraft/item/Item;>;", null);
            fv.visitEnd();
        }
        {
            for (int i = 0; i < itemCount; i++) {
                fv = cw.visitField(
                        ACC_PUBLIC + ACC_FINAL + ACC_STATIC,
                        ITEM_PREFIX + i,
                        "Lnet/minecraftforge/fml/RegistryObject;",
                        "Lnet/minecraftforge/fml/RegistryObject<Lnet/minecraft/item/Item;>;",
                        null);
                fv.visitEnd();
            }
        }
        {
            mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(line++, l0);
            mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/registries/ForgeRegistries", "ITEMS", "Lnet/minecraftforge/registries/IForgeRegistry;");
            mv.visitLdcInsn("ibocore");
            mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/registries/DeferredRegister", "create", "(Lnet/minecraftforge/registries/IForgeRegistry;Ljava/lang/String;)Lnet/minecraftforge/registries/DeferredRegister;", false);
            mv.visitFieldInsn(PUTSTATIC, "de/blutmondgilde/ibocore/item/ItemList", "ITEM_REGISTRY", "Lnet/minecraftforge/registries/DeferredRegister;");
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(line++, l1);
            mv.visitFieldInsn(GETSTATIC, "de/blutmondgilde/ibocore/item/ItemList", "ITEM_REGISTRY", "Lnet/minecraftforge/registries/DeferredRegister;");
            mv.visitLdcInsn("test_item");
            mv.visitInvokeDynamicInsn("get", "()Ljava/util/function/Supplier;", new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[]{Type.getType("()Ljava/lang/Object;"), new Handle(Opcodes.H_NEWINVOKESPECIAL, "de/blutmondgilde/ibocore/item/templates/DefaultItemTemplate", "<init>", "()V"), Type.getType("()Lnet/minecraft/item/Item;")});
            mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraftforge/registries/DeferredRegister", "register", "(Ljava/lang/String;Ljava/util/function/Supplier;)Lnet/minecraftforge/fml/RegistryObject;", false);
            mv.visitFieldInsn(PUTSTATIC, "de/blutmondgilde/ibocore/item/ItemList", "TEST_ITEM", "Lnet/minecraftforge/fml/RegistryObject;");

            Label[] labels = new Label[itemCount + 1];
            for (int i = 0; i < itemCount; i++) {
                //Label
                labels[i] = new Label();
                mv.visitLabel(labels[i]);
                mv.visitLineNumber(line++, labels[i]);
                mv.visitFieldInsn(
                        GETSTATIC,
                        "de/blutmondgilde/ibocore/item/ItemList",
                        "ITEM_REGISTRY",
                        "Lnet/minecraftforge/registries/DeferredRegister;"
                );
                //Item Registry Name
                mv.visitLdcInsn("generated_item_" + i);
                mv.visitInvokeDynamicInsn(
                        "get",
                        "()Ljava/util/function/Supplier;",
                        new Handle(
                                Opcodes.H_INVOKESTATIC,
                                "java/lang/invoke/LambdaMetafactory",
                                "metafactory",
                                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                        new Object[]{
                                Type.getType("()Ljava/lang/Object;"),
                                new Handle(Opcodes.H_NEWINVOKESPECIAL,
                                        "de/blutmondgilde/ibocore/item/templates/DefaultItemTemplate",
                                        "<init>", "()V"),
                                Type.getType("()Lnet/minecraft/item/Item;")
                        }
                );
                mv.visitMethodInsn(
                        INVOKEVIRTUAL,
                        "net/minecraftforge/registries/DeferredRegister",
                        "register",
                        "(Ljava/lang/String;Ljava/util/function/Supplier;)Lnet/minecraftforge/fml/RegistryObject;",
                        false
                );
                //Var Name
                mv.visitFieldInsn(
                        PUTSTATIC,
                        "de/blutmondgilde/ibocore/item/ItemList",
                        ITEM_PREFIX + i,
                        "Lnet/minecraftforge/fml/RegistryObject;"
                );
            }

            mv.visitInsn(RETURN);
            mv.visitMaxs(3, 0);
            mv.visitEnd();

        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(12, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
            mv.visitInsn(RETURN);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLocalVariable("this", "Lde/blutmondgilde/ibocore/item/ItemList;", null, l0, l1, 0);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "register", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(3 + line++, l0);
            mv.visitFieldInsn(GETSTATIC, "de/blutmondgilde/ibocore/item/ItemList", "ITEM_REGISTRY", "Lnet/minecraftforge/registries/DeferredRegister;");
            mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext", "get", "()Lnet/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext", "getModEventBus", "()Lnet/minecraftforge/eventbus/api/IEventBus;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraftforge/registries/DeferredRegister", "register", "(Lnet/minecraftforge/eventbus/api/IEventBus;)V", false);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLineNumber(3 + line++, l1);
            mv.visitLdcInsn("IBO-Core/Items");
            mv.visitMethodInsn(INVOKESTATIC, "org/apache/logging/log4j/LogManager", "getLogger", "(Ljava/lang/String;)Lorg/apache/logging/log4j/Logger;", false);
            mv.visitLdcInsn("Registered Items");
            mv.visitMethodInsn(INVOKEINTERFACE, "org/apache/logging/log4j/Logger", "info", "(Ljava/lang/String;)V", true);
            Label l2 = new Label();
            mv.visitLabel(l2);
            mv.visitLineNumber(3 + line++, l2);
            mv.visitInsn(RETURN);
            mv.visitMaxs(2, 0);
            mv.visitEnd();
        }
        cw.visitEnd();

        return cw.toByteArray();
    }

Die Methode wird direkt aus meiner "main" Methode aufgerufen. Leider werden die Bytecode Änderungen nicht übernommen. Generiert die Methode nur den Code und ich muss ihn noch irgendwie anwenden?

Vielen Dank im voraus für jede Hilfe!
 

LimDul

Top Contributor
Aus dem Bauch heraus -du manipulierst den ByteCode. Wenn die Klasse, deren ByteCode du änderst, schon geladen ist,wirst du die vermutlich neu laden müssen. Du wirst also an der Stelle vermutlich nicht um eigene ClassLoader drumrumkommen. Damit steigst du aber sehr tief in technische Gefilde herab, die ich persönlich unter Schwarze Magie ablege :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C In DefaultTableModel nachträglich Werte einfügen Allgemeine Java-Themen 2
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
S Link element an vorletzte stelle einfügen Allgemeine Java-Themen 2
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
G Excel Tabelle lesen und in neue Excel Tabelle einfügen Allgemeine Java-Themen 11
S Wo .close() einfügen? Allgemeine Java-Themen 0
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
K Swing OpenStreetMap in JFrame einfügen Allgemeine Java-Themen 1
B Eclipse Ekit-Editor einfügen Allgemeine Java-Themen 0
T Neuen Kanal in Bild (TIFF) einfügen à la Photoshop Allgemeine Java-Themen 2
D Symbol in Word-Dokument einfügen Allgemeine Java-Themen 1
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F 2D Array in jList einfügen Allgemeine Java-Themen 8
J XML Dokument Zeilenumbruch in den Quellcode einfügen Allgemeine Java-Themen 5
H Semicolon Einfügen JSP Seite Allgemeine Java-Themen 9
K Neue Elemente in JList einfügen Allgemeine Java-Themen 2
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
S JPanel einfügen in MainClass Allgemeine Java-Themen 4
R Schnelles Einfügen in SortedSet Allgemeine Java-Themen 11
Z Ausschneiden, Kopieren, Einfügen, Löschen in JTextArea Allgemeine Java-Themen 5
JAVAnnik Bilder in JLabel Array einfügen Allgemeine Java-Themen 2
E Bild mit Listener einfügen Allgemeine Java-Themen 3
reibi Leeres Verzeichnis in ein Zipfile einfügen Allgemeine Java-Themen 12
N Tupel in eine SET einfügen Allgemeine Java-Themen 3
S Progressbar einfügen Allgemeine Java-Themen 4
W xml File einlesen und in eine andere xml File einfügen.. Allgemeine Java-Themen 2
L List <Hauser> in Combobox einfügen Allgemeine Java-Themen 5
D Kopieren und Einfügen Allgemeine Java-Themen 8
D Einfügen über JMenuBar Allgemeine Java-Themen 4
N einfügen string in methode Allgemeine Java-Themen 10
R doppelt verkettete Liste: Fehler beim Einfügen Allgemeine Java-Themen 3
G Zeile einfügen in TreeTable Allgemeine Java-Themen 2
G Teilstring in einen String einfügen Allgemeine Java-Themen 5
G Tabelleneintrag einfügen Allgemeine Java-Themen 10
P JTree/ Nodes einfügen Allgemeine Java-Themen 2
G Plug-in: Wie JButton einfügen? Allgemeine Java-Themen 12
A FileChannel: Mitten in eine Datei was einfügen Allgemeine Java-Themen 2
W Daten in Access einfügen über Java Allgemeine Java-Themen 21
G Plugin (Visual Editor) in Eclipse einfügen Allgemeine Java-Themen 2
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
P Timestamp in eine Firebird-Datenbank einfügen Allgemeine Java-Themen 6
K Bilder mit Java in MS Word einfügen Allgemeine Java-Themen 2
M Text in JTextfield einfügen sofort dann wird Text gekürzt Allgemeine Java-Themen 2
H html datein einfügen Allgemeine Java-Themen 7
M Pfeilzeichen (z.B. ALT + 26) einfügen Allgemeine Java-Themen 2
S Bild aus Zwischenablage in Applet einfügen Allgemeine Java-Themen 2
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Werte in Tabelle einfügen! Allgemeine Java-Themen 9
N Zeilenumbruch in String nach jeweils x Zeichen einfügen? Allgemeine Java-Themen 6
G Text cursorgenau einfügen [ehemals hilfe ... dringend] Allgemeine Java-Themen 7
G Hilfe - JButton in JTable (Spalte) einfügen! Allgemeine Java-Themen 6
S addAtPosition - Zahl an einer bestimmten Position einfügen Allgemeine Java-Themen 8
G wie Klasse in JFrame "einfügen" Allgemeine Java-Themen 12
D iText: Tabelle in Footer einfügen Allgemeine Java-Themen 6
G Einfügen von Werten aus TXT-Datei in ein Array !?! Allgemeine Java-Themen 9
D Unbekannter Fehler Allgemeine Java-Themen 1
Thallius HTTPS Request mit unbekannter Instanz Allgemeine Java-Themen 24
C Best Practice Tiefe Kopie eines Arrays unbekannter Dimension und unbekannten Typs Allgemeine Java-Themen 4
E ArrayList mit unbekannter Größe Allgemeine Java-Themen 8
D Datentypen Typbestimmung unbekannter Wrapper-Klassen Allgemeine Java-Themen 5
G Exception mit unbekannter Quelle Allgemeine Java-Themen 11
S array von unbekannter größe Allgemeine Java-Themen 2
M Dynamisches ausführen von methoden unbekannter klassen Allgemeine Java-Themen 6
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
T Menge an Elementen aus einer LinkedList Allgemeine Java-Themen 6
L Menge der Buchstaben eines Textes zählen Allgemeine Java-Themen 3
J Die Menge einer Zahl im Binärbaum zählen Allgemeine Java-Themen 7
X Vector in Intervall-Menge umwandeln Allgemeine Java-Themen 4
J Konstrukt um alle Paare und Tripel einer Punkte-Menge bilden Allgemeine Java-Themen 12
Ark Visualisierung der Julia-Menge / Fraktale Allgemeine Java-Themen 2
D Mittelwert einer Menge von Doubles berechnen Allgemeine Java-Themen 3
R Menge an Bytes eines OutputStreams ermitteln. Allgemeine Java-Themen 6
J Unbestimmte Menge Objekte erstellen und "verwalten&quot Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben