Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor

Kr0e

Gesperrter Benutzer
Hallo Zusammen!

ich frage mich, wie die Java Serialisierung es hinbekommt, Klassen beim Deserialisieren wieder zu erstellen, ggf. ohne dass diese Klasse einen public-default-constructor. Ich schreibe eine eigene kleine Serialisierungsvariante, aber hier hänge ich grad iwie.

Gruß,

Chris
 
T

Tomate_Salat

Gast
Ich denke, Java erstellt kein Objekt und weist dem die Werte zu, sondern speichert beim Seriallisieren das komplette Objekt. Somit ist ein Aufrufen des (default)-Konstruktors nicht mehr notwendig.
 

Kr0e

Gesperrter Benutzer
Doch, Java erstellt neue Objekte und füllt alle Felder mit Reflection. Soviel weiß ich schon....

Aber die Frage ist halt, wie Java diese Constructoren beschafft... Aber habs nun gefunden und leider ist das nicht pure-Java wie ich gehofft hatte =(

Java:
    /** reflection factory for obtaining serialization constructors */
    private static final ReflectionFactory reflFactory = (ReflectionFactory)
	AccessController.doPrivileged(
	    new ReflectionFactory.GetReflectionFactoryAction());

Im ObjectOutputStream wird diese Factory genutzt, um einen Constructor von der JVM erstellen zu lassen, falls kein Default vorhanden ist... Darauf hat man natürlich als Programmierer keinen Zugriff.
com.sun.* Paket...

NAja, dann müssen meine Klassen halt zwingend einen Default-Konstruktor haben =(

Danke trotzdem!

Gruß,

Chris
 
T

Tomate_Salat

Gast
Vllt hilfts:
Discover the secrets of the Java Serialization API
da gibt es einen Punkt: Create Your Own Protocol: the Externalizable Interface. Habe ich selber noch nie benutzt. Aber wenn du das Interface benutzt + die 2 Methoden zum schreiben+lesen definierst, könntest du (theoretisch) deine eigene Seriallsierung nutzen, wie die es vor hast.
 

Kr0e

Gesperrter Benutzer
Hallo!

Externalizable ist mir bereits bekannt, aber danke. Mich stört an Externalizable dass dort (auch wenn es immerhin ein Schritt in die richtige Richtung ist, das Speichern/Laden selbst zu managen), immernoch die ClassDesc gespeicher wird. Sprich der qualified Name der Klasse und noch die Länge des Namen als Short. Wenn man zig-tausend Objekte hat, stört mich der entstehende Overhead. Ich würde nur eine short-ID mitliefern. Auf beiden Seiten sind die short-ids nämlich bekannt.

Kryo ist natürlich auch eine Lösung, aber dort gehen rekursive Verlinkungen nciht. Deswegen brauch ich die Möglichkeit, das Objekt zu erstellen, bevor ich es fülle, damit ich das Object schonmal beim Lesen cachen kann und wiederauftretende Objekte aus dem Cache hole und nicht erneut schreibe...

Naja, vlt ist die Methode mit dem public Constructor garnicht verkehrt....

Danke nochmal!

Gruß,

Chris
 

Kr0e

Gesperrter Benutzer
Beim Suchen einer Lösung bin ich auf noch eine andere Variante egstoßen:

(Habt ihr davon schonmal gehört ?? - Ich nicht...)

JBoss Serialization - JBoss Community

Die bieten eine alternative Serialisierung an, die wohl schneller und performanter sein soll. Ebenfalls einfahc bedienbar wie die Java Serialisierung.

Gruß,

Chris


EDIT: Naja, das Problem bleibt das Gleiche, der basiert im Prinzip auf ObjectOutputStream mit ein paar Optimierungen....
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Hätte auch noch eine (interessante) Lösung:
Java:
public class Tokenizer 
{	
	String data;
	
	private Tokenizer(String s, int i,JFrame f) 
	{
		data=s+i;
	}
	
	public String getData()
	{
		return data;
	}
	
	public static void main(String[] args) throws Exception 
	{		
		Constructor<?> c=Tokenizer.class.getDeclaredConstructors()[0];
		c.setAccessible(true);
		Vector<Object> v=new Vector<Object>();

		for(Class<?> classes:c.getParameterTypes())
			v.add(classes.isPrimitive() ? 0 : null);

		Tokenizer t=(Tokenizer) c.newInstance(v.toArray());
				
		System.out.println(t.getData());
	}
}

ein Konstruktor ist ja immer vorhanden und diese Methode setzt einfach immer null oder 0 ein.
 

Kr0e

Gesperrter Benutzer
Interessante Idee, hatte die gleiche idee, aber es scheitert leider daran, dass manche Constructoren Exceptions werfen können, wodurch viele Klassen nicht instanzierbar wären.

Ich glaube, ich versuchs mal mit Objenesis. Wobei dort beschrieben wird, dass es nicht mit jeder JVM klappen muss, wobei es dennoch bei den meisten funktioniert.

Gruß,

Chris

EDIT: Ich meine natülrich Exceptions, wenn gewisse Parameter null sind.
 

Ariol

Top Contributor
....
ein Konstruktor ist ja immer vorhanden und diese Methode setzt einfach immer null oder 0 ein.

Je nachdem was darin gemacht wird, fliegt ihm dann aber einen NPE um die Ohren.

Ich dachte eher an so etwas:
Java:
package vererbung;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import sun.reflect.ReflectionFactory;

public class Test {

	int i;

	public Test(String test) {
		System.out.println("CALLED with " + test);
	}

	public static void main(String[] args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
		ReflectionFactory factory = ReflectionFactory.getReflectionFactory();
		Constructor<Test> constructor = factory.newConstructor(Test.class,
				new Class[0], new Class[0], Constructor.PUBLIC|Constructor.DECLARED, 0, "j  vererbung.Test.<init>()V+1", new byte[0],
				new byte[0]);
		constructor.setAccessible(true);
		Test t1 = constructor.newInstance();
		System.out.println(t1.i);
		//Set fields

	}
}

Aber das kracht aktuell auch noch...
 

Ariol

Top Contributor
Das hier gibt immer noch den einen/ursprünglichen Konstruktor aus:
Java:
		System.out.println(Arrays.toString(Test.class.getConstructors()));
		System.out.println(Arrays.toString(Test.class.getDeclaredConstructors()));
 

Kr0e

Gesperrter Benutzer
Kurze Frage: Wie kommst du an ReflectionFactory? Mein Eclipse findet nichts, natürlich hab ich die Improtanweisung drin ;)

Außerdem sollte man von der Benutzung von sun.* - Paketen doch absehen, oder ? Bzw. die könnten sich ja ändern in folgenden Releases.


Die ReflectionFactory hab ich auch gefunden, als ich den ObjectInputStream durchforstet hab...
 

Kr0e

Gesperrter Benutzer
Vlt ist doch die Externalizable am sinnvollsten (Wie Tomate_Salat bereits vorgeschlagen hat).
Anscheinend gibt es keine "offizielle" Lösung für dieses Vorhaben, die vom jetztigen Java-Sortiment angeboten wird. Objenesis muss dann wohl ähnlich "fragwürdige" Lösungen nehmen, wodurch auch der Warnhinweiß "Könnte in verscheidenen Java-Versionen nciht mehr funktionieren." klar wird.

Ohnehin stelle ich mir noch die Frage, ob es überhaupt Sinn macht, das selbst zu machen. Ich würde bei final-fields ja dann wieder Reflection nutzen, um die Felder quasi ansprechbar zu machen. Ic hweiß nicht, ob das wirklich eine Zeitersparnis wäre. Allerhöchstens vom Speicherbedarf, der ja bei Java-Standard-Serialisierung reht hoch ist.
 
T

Tomate_Salat

Gast
So:
Java:
import java.lang.reflect.Constructor;

import sun.reflect.ReflectionFactory;

public class RFTest 
{
	private RFTest(String test)
	{
		test.charAt(0);
	}
	
	public void test()
	{
		System.out.println("HIER");
	}
	
	public static void main(String[] args) throws Exception
	{
		ReflectionFactory factory=ReflectionFactory.getReflectionFactory();
		Constructor<RFTest> constr = factory.newConstructorForSerialization(RFTest.class, Object.class.getDeclaredConstructor());
		RFTest test=constr.newInstance();
		test.test();
	}
}
funktioniert bei mir ohne zu krachen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben