Avatar billede kernelx Juniormester
25. februar 2009 - 07:51 Der er 8 kommentarer og
1 løsning

Få fat i den class, som kalder constructor

Hi,

jeg har et object af klassen "Test" som kalder en constructor i Test2.
Nu vil jeg gerne finde ud af, hvilket object der har kaldet denne constructor - og arbejde videre med dette.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
public class Test2 {
    public Test2() {
        Object callerObject = null; // xyz.getObject(); --> "Test"
        if ( callerObject instanceof Test ) {
            Test co = (Test)callerObject;
            co.printOK();
        }
    }
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
public class Test {

    public static void main( String[] args ) {
      Test test = new Test();
    }

    public Test() {
      this.test2 = new Test2();
    }

    private Test2 test2 = null;

    public void printOK() {
        System.out.println( "OK" );
    }
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

Hvad skal der stå i stedet for:
"xyz.getObject();"
?


Min tankegang er, at jeg har et root-object, som har en form for registry-object - og at jeg ikke hele tiden vil have denne registry inde i en constructor.
På denne måde kan jeg gå tilbage til ...

if ( callerObject instanceof rootClass ) {
    ...
}

og på denne måde få fat i registry-objectet.


med venlig hilsen
KernelX
Avatar billede erikjacobsen Ekspert
25. februar 2009 - 08:51 #1
Du kan tage kalde-objektet med som parameter til constructoren. Der findes mig bekendt ikke andre muligheder.
Avatar billede kernelx Juniormester
25. februar 2009 - 10:13 #2
Det var netop det, som jeg ville undgå.
Men hvis der ikke er andre muligheder, så bliver jeg nød til at læve det på denne måde.

Mange tak!
husk at skrive et eller andet som svar.
Avatar billede erikjacobsen Ekspert
25. februar 2009 - 10:26 #3
Ingen point til mig, tak.

Men vent og se om andre ved mere end mig.
Avatar billede arne_v Ekspert
25. februar 2009 - 22:55 #4
Eriks løsning er den rigtige.

Under håbløse hacks finder man løsningen:

      Exception ex = new Exception();
      StackTraceElement[] ste = ex.getStackTrace();

og så kigge lidt i ste.
Avatar billede arne_v Ekspert
26. februar 2009 - 06:30 #5
Hm. Nu skal jeg naturligvis læse hele spørgsmåls teksten og ikke kun overskriften.

class Test2 {
    public Test2() {
        Exception ex = new Exception();
        StackTraceElement[] ste = ex.getStackTrace();
        if ( ste[1].getClassName().equals("Test") ) {
            System.out.println("haps");
        }
    }
}

finder klassen men ikke instansen.

Men hvad vil du have hvis constructor bliver kaldt fra en static metode ?
Avatar billede arne_v Ekspert
26. februar 2009 - 07:11 #6
Men hvis du ved at det ikke er et problem, så kan vi gribe til de grove midler.

Du kan bruge AspectJ !

Test.java
---------

public class Test {
    private Test2 test2 = null;
    public Test() {
        test2 = new Test2();
    }
    public void printOK() {
        System.out.println( "OK" );
    }
    public static void main( String[] args ) {
        Test test = new Test();
    }
}

class Test2 {
    public Test2() {
        Exception ex = new Exception();
        StackTraceElement[] ste = ex.getStackTrace();
        if ( ste[1].getClassName().equals("Test") ) {
            System.out.println("haps");
        }
    }
    public Test2(Test co) {
        co.printOK();
    }
}

Hack.aj
-------

import java.lang.reflect.*;

import org.aspectj.lang.*;
import org.aspectj.lang.annotation.*;

@Aspect
public class Hack {
    @Pointcut("call(Test2.new())")
    public void newTest2Handler() {}
    @Around(value = "newTest2Handler()")
    public Object addExtraArg(ProceedingJoinPoint pjp) {
        Object caller = pjp.getThis();
        if(caller instanceof Test) {
            return new Test2((Test)caller);
        } else {
            return pjp.proceed();
        }
    }
}

kørsel
------

C:\>ajc -source 1.5 Test.java Hack.aj

C:\>java Test
OK
Avatar billede kernelx Juniormester
27. februar 2009 - 06:55 #7
husk at skrive et eller andet som svar.
Mange tak!
Avatar billede arne_v Ekspert
27. februar 2009 - 07:13 #8
Noget af det kunne bruges ?
Avatar billede kernelx Juniormester
02. marts 2009 - 19:00 #9
ja, mange tak.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester