2012-03-24 9 views
2

Ich verwende Apache BCEL dynamisch auf Java-Klassen zu erstellen, die jeder seine eigene Bild zugeordnet. Diese generierten Klasse implementieren die folgende Schnittstelle:Ist es möglich, einen Byte-Array (Rohdaten) in einer Java-Klasse-Datei zu speichern?

interface ImageOwner { 

    byte[] getImage(); 

} 

Wenn dynamisch das ‚getImage‘ Verfahren implementiert, könnte ich Bytecode generieren erstellen/Return den Byte-Array, wenn die Methode aufgerufen wird, aber ich würde lieber zurückkehren nur einen Verweis auf das Byte-Array, wenn möglich. Ist es möglich, Rohdaten in einer Java-Klassendatei zu speichern?

+2

Ein Array * * ist ein Verweis in Java. Ich bin mir nicht sicher, was du fragst. –

+0

Ich weiß, ich dachte daran, diese Referenz aus einem konstanten Pool oder so zu bekommen. –

+0

* Genau * was meinst du mit "dieser Art von Rohdaten". – Bohemian

Antwort

1

Nach einigen Recherchen, der beste Weg, fand ich meine Bedürfnisse zu erreichen war, base64 codiert die Bilddaten und verwendet den Konstantenpool, um den resultierenden String zu speichern. Selbst mit dem Verlust von ~ 30% scheint es besser zu sein, als den Konstruktor oder andere Methoden zu verwenden, um ein Byte-Array-Feld zu initialisieren.

1

Ich bin wirklich hier nicht sicher, denn es ist zu einfach scheint eine Frage, aber der Vollständigkeit halber, wird dies tun, was ich denke, was Sie tun möchten:

public class ImageOwnerImpl implements ImageOwner { 

    // A literal byte array. Tedious, but you could write code 
    // to auto-generate this source from a file 
    private byte[] imageByteArray = new byte[] { -128, 127, ...etc }; 

    public byte[] getImage() { 
     return imageByteArray; 
    } 
} 

Dies ist eine wörtliche Byte-Array, das beantwortet Ihre Frage "Wie die Bytes in der Klassendatei gespeichert werden".

Die meisten Leute würden die Bild Bytes aus einer Datei zur Laufzeit in den Konstruktor laden, können Sie jedoch einige spezielle Notwendigkeit haben, dass garantiert, dass dieses Vorgehen

+0

Das ist mehr oder weniger das, was ich brauche, aber ich möchte keine externe Utility-Klasse aufrufen, um die Bytes zu erhalten, stattdessen möchte ich die Bytes in der Klassendatei speichern und im Klassenkörper abrufen –

+0

If what Ich will nicht möglich und Sie wissen sicher, nur in der Antwort angeben, und ich werde als richtig markieren. –

+0

@ThiadodeArruda Ich habe den Code bearbeitet, um ein Beispiel zu geben, wie es geht – Bohemian

0

einfach eine Impl Klasse definieren, die eine statische initialiser hat, die die Rohdaten aus einer Datei lädt, die in Ihrem Glas und geladen über den Classloader enthalten ist.

0

Sie könnten nur speichern Sie es als Byte-Array die Syntax für Array in BCEL ist

[B 

für Byte-Array

[java.lang.String 

für ein String-Array usw.

0

Die einzigen Konstanten Sie können im Konstantenpool Ints, Floats, Longs, Doubles, Strings und Classes speichern. Am besten ist es, wenn Sie es als String speichern und es zur Laufzeit in ein Byte [] umwandeln. Sie müssen diese nicht codieren, da Strings Null-Zeichen verarbeiten können, solange Sie die korrekte modifizierte Unicode-Codierung anwenden.