* lav en privat variabel 'obj_type', der angiver objektets type * lad alle public metoder være uden parameter, men lad dem kalde private parametrisede metoder, der tager en objekt type varaibel
Du kan override en metode ved runtime hvis den vel at mærke er defineret i et interface. Så benytter du Proxy klassen med en InvocationHandler til at klare det, men det er helt trivielt.
carsten >> interface ok, det kænner jag, men som man normalt bruger et interface er man nødt till at bruge en klass der definierar den metode. og hvis man bruger en abstractclass måste man definiera den metode vid new...
men hvad er proxy-klassen og en InvocationHandler?
Undskyld, men jeg så ikke din kommentar. Proxy og InvocationHandler er nogle af de mere interessante aspekter af Java API'erne. De ligger i java.lang.reflect og er en del af den såkaldte reflection API (sammen med java.lang.Class). Den tillader at du tager et objekt under runtime, og fjerner og tilføjer interfaces som du har lyst og så genererer den et nyt objekt der implementerer de ønskede interfaces. Det er virkelig et stærkt værktøj som jeg bruger meget, men det er ikke så let at arbejde med.
Her er et lille eksempel der viser hvordan man kan tilføje et interface java.io.Serializable ved runtime, og samtidig skriver den ud når der kaldes metoder på objektet. Dette kan bruges til at lave elegant debugging. import java.util.*; import java.lang.reflect.*;
public class SimpleProxy implements InvocationHandler {
Object o;
private SimpleProxy( Object o ) { this.o = o; }
public static Object proxyFor( Object o ) { Class objClass = o.getClass(); Class[] oldInterfaces = objClass.getInterfaces(); Class[] newInterfaces = new Class[ oldInterfaces.length + 1 ]; for (int i = 0; i < oldInterfaces.length; i++) newInterfaces[ i ] = oldInterfaces[ i ]; newInterfaces[ oldInterfaces.length ] = java.io.Serializable.class; return Proxy.newProxyInstance( objClass.getClassLoader(), newInterfaces, new SimpleProxy( o ) ); }
public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable { System.out.println("Invoking " + method.getName() ); Object returnValue = method.invoke( o, args ); System.out.println( "Return value is: " + returnValue ); return returnValue; } // invoke
public static void main( String[] args ) { java.util.List list = new java.util.ArrayList(); Object o = SimpleProxy.proxyFor( list ); java.io.Serializable ser = (java.io.Serializable)o; java.util.List lst = (java.util.List)o; lst.add("abc"); int hashCode = lst.hashCode(); System.out.println("ser="+ser); System.out.println("lst="+lst); } }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.