Thomas Darimont
Erfahrenes Mitglied
Hallo,
ein Java DynamicProxy (java.lang.reflect.Proxy) generiert zur Laufzeit Bytecode für eine neue Klasse die die angegebenen Interfaces implementiert und alle Aufrufe an den angegebenen InvocationHandler dispatched. Der daraus resultierende Proxy kann dann über die implementierten Interfaces angesprochen werden (man kann in auf die angegebenen Interfaces casten). Somit ist der Proxy mit allen Methoden ansprechbar die in den Interfaces definiert sind (natürlich werden alle Methoden von java.lang.Object auch dispatched).
Startet man das oben genannte Beispiel (PropertyChangeAwareProxyExample ) mit dem JVM Property:
So findet man im classpath-root die folgende generierte Klasse:
Gruß Tom
ein Java DynamicProxy (java.lang.reflect.Proxy) generiert zur Laufzeit Bytecode für eine neue Klasse die die angegebenen Interfaces implementiert und alle Aufrufe an den angegebenen InvocationHandler dispatched. Der daraus resultierende Proxy kann dann über die implementierten Interfaces angesprochen werden (man kann in auf die angegebenen Interfaces casten). Somit ist der Proxy mit allen Methoden ansprechbar die in den Interfaces definiert sind (natürlich werden alle Methoden von java.lang.Object auch dispatched).
Startet man das oben genannte Beispiel (PropertyChangeAwareProxyExample ) mit dem JVM Property:
Code:
-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true
Java:
// Decompiled by DJ v3.7.7.81 Copyright 2004 Atanas Neshkov Date: 27.05.2007 18:05:09
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
import de.tutorials.IDomainObject;
import java.lang.reflect.*;
public final class $Proxy0 extends Proxy
implements IDomainObject
{
public $Proxy0(InvocationHandler invocationhandler)
{
super(invocationhandler);
}
public final boolean equals(Object obj)
{
try
{
return ((Boolean)super.h.invoke(this, m1, new Object[] {
obj
})).booleanValue();
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final int getAnotherProperty()
{
try
{
return ((Integer)super.h.invoke(this, m6, null)).intValue();
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final void setAnotherProperty(int i)
{
try
{
super.h.invoke(this, m5, new Object[] {
Integer.valueOf(i)
});
return;
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final int hashCode()
{
try
{
return ((Integer)super.h.invoke(this, m0, null)).intValue();
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final void setProperty(String s)
{
try
{
super.h.invoke(this, m3, new Object[] {
s
});
return;
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final String getProperty()
{
try
{
return (String)super.h.invoke(this, m4, null);
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final String toString()
{
try
{
return (String)super.h.invoke(this, m2, null);
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
private static Method m1;
private static Method m6;
private static Method m5;
private static Method m0;
private static Method m3;
private static Method m4;
private static Method m2;
static
{
try
{
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {
Class.forName("java.lang.Object")
});
m6 = Class.forName("de.tutorials.IDomainObject").getMethod("getAnotherProperty", new Class[0]);
m5 = Class.forName("de.tutorials.IDomainObject").getMethod("setAnotherProperty", new Class[] {
Integer.TYPE
});
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m3 = Class.forName("de.tutorials.IDomainObject").getMethod("setProperty", new Class[] {
Class.forName("java.lang.String")
});
m4 = Class.forName("de.tutorials.IDomainObject").getMethod("getProperty", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
}
catch(NoSuchMethodException nosuchmethodexception)
{
throw new NoSuchMethodError(nosuchmethodexception.getMessage());
}
catch(ClassNotFoundException classnotfoundexception)
{
throw new NoClassDefFoundError(classnotfoundexception.getMessage());
}
}
}
Gruß Tom