Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Getting a reference to caller object

Reply
Thread Tools

Getting a reference to caller object

 
 
puchacz
Guest
Posts: n/a
 
      11-26-2010
Hi,

Is it possible to get a reference to caller object (and recursively
all the way up the call stack)? I know about Thread.dumpStack() that
calls new Exception() internally and about sun.reflect.Reflection
class, but you can only get information about classes, method names
and lines - not reference to live objects that in turn can be
inspected using reflection for all field values etc. I know in general
it is probably possible, because this is what debuggers do when
showing stack frame.

What would it take to get this information? It does not have to be
100% compatible with all versions of JDK. Anything in reflection
internal packages? Or maybe there's a library that already does it? To
what degree it is possible without (a) running the whole jvm in
special mode - like debug mode and (b) without processing the whole
program in AspectJ or Hibernate bytecode postprocessors style, and of
course (c) without rewriting the source to pass around "this"
everywhere?

Cheers,
Piotr
 
Reply With Quote
 
 
 
 
Eric Sosman
Guest
Posts: n/a
 
      11-26-2010
On 11/26/2010 3:38 PM, puchacz wrote:
> Hi,
>
> Is it possible to get a reference to caller object (and recursively
> all the way up the call stack)? [...]


Maybe. What do you mean by "caller object?" For example, in

public class Piotr {
public static void main(String[] unused) {
System.out.println(hello());
}
private static String hello() {
// What is the "caller object" here?
return "Bonjour";
}
}

> [...] I know in general
> it is probably possible, because this is what debuggers do when
> showing stack frame.


The debuggers I have used will show the method associated with
each stack frame, and the class the method belongs to, and the source
code's line number (if it's available). I have not seen a debugger
that shows anything I would term a "caller object," so again: What
do you mean? More to the point, what problem are you trying to solve?

--
Eric Sosman
lid
 
Reply With Quote
 
 
 
 
Arne Vajhøj
Guest
Posts: n/a
 
      11-26-2010
On 26-11-2010 15:38, puchacz wrote:
> Is it possible to get a reference to caller object (and recursively
> all the way up the call stack)? I know about Thread.dumpStack() that
> calls new Exception() internally and about sun.reflect.Reflection
> class, but you can only get information about classes, method names
> and lines - not reference to live objects that in turn can be
> inspected using reflection for all field values etc. I know in general
> it is probably possible, because this is what debuggers do when
> showing stack frame.


I don't think you can.

> What would it take to get this information? It does not have to be
> 100% compatible with all versions of JDK. Anything in reflection
> internal packages? Or maybe there's a library that already does it? To
> what degree it is possible without (a) running the whole jvm in
> special mode - like debug mode and (b) without processing the whole
> program in AspectJ or Hibernate bytecode postprocessors style, and of
> course (c) without rewriting the source to pass around "this"
> everywhere?


I think you need to redesign so that you don't need this feature.

Arne
 
Reply With Quote
 
Stefan Ram
Guest
Posts: n/a
 
      11-26-2010
Eric Sosman <> writes:
> public class Piotr {
> public static void main(String[] unused) {
> System.out.println(hello()); (...)
> // What is the "caller object" here?


The closest approximation to an answer to the above
question might be »Piotr.class«.

(But I do not know whether such an object is instanciated
when the class »Piotr« is initialized or only when such
an object is first needed.)

 
Reply With Quote
 
Mike Schilling
Guest
Posts: n/a
 
      11-27-2010


"Eric Sosman" <> wrote in message
news:icp7kf$ri3$...
> On 11/26/2010 3:38 PM, puchacz wrote:
>> Hi,
>>
>> Is it possible to get a reference to caller object (and recursively
>> all the way up the call stack)? [...]

>
> Maybe. What do you mean by "caller object?" For example, in
>
> public class Piotr {
> public static void main(String[] unused) {
> System.out.println(hello());
> }
> private static String hello() {
> // What is the "caller object" here?
> return "Bonjour";
> }
> }
>
>> [...] I know in general
>> it is probably possible, because this is what debuggers do when
>> showing stack frame.

>
> The debuggers I have used will show the method associated with
> each stack frame, and the class the method belongs to, and the source
> code's line number (if it's available).


And the local variables for each frame, including "this" (if the frame has a
this.) I think the last of these is what's being asked for.


 
Reply With Quote
 
Lew
Guest
Posts: n/a
 
      11-27-2010
Eric Sosman writes:
>> public class Piotr {
>> public static void main(String[] unused) {
>> System.out.println(hello()); (...)
>> // What is the "caller object" here?


Stefan Ram wrote:
> The closest approximation to an answer to the above
> question might be »Piotr.class«.
>
> (But I do not know whether such an object is instanciated
> when the class »Piotr« is initialized or only when such
> an object is first needed.)


The class object comes into existence when the class is loaded, but not all
class initialization happens then. The 'class' attribute is an attribute of
the class object, not the class object itself. The VM loader loads and
initializes the class 'Piotr' and calls its 'main()', and thus 'Piotr',
running 'main()', is the caller of 'hello()'.

The class is loaded upon first reference to it or its members, but not
necessarily initialized right then. For example, a reference to 'Piotr.class'
will load 'Piotr' if it wasn't already, but not initialize it.

The invocation of 'main()' will cause class initialization, so that will have
happened before the call to 'hello()'.

--
Lew
 
Reply With Quote
 
puchacz
Guest
Posts: n/a
 
      11-28-2010
On Nov 27, 3:46*am, Lew <no...@lewscanon.com> wrote:
> Eric Sosman writes:
> >> * * * *public class Piotr {
> >> * * * * * *public static void main(String[] unused) {
> >> * * * * * * * *System.out.println(hello()); * * * * * *(...)
> >> * * * * * * * *// What is the "caller object" here?

> Stefan Ram wrote:
> > * *The closest approximation to an answer to the above
> > * *question might be »Piotr.class«.

>
> > * *(But I do not know whether such an object is instanciated
> > * *when the class »Piotr« is initialized or only when such
> > * *an object is first needed.)

>
> The class object comes into existence when the class is loaded, but not all
> class initialization happens then. *The 'class' attribute is an attribute of
> the class object, not the class object itself. *The VM loader loads and
> initializes the class 'Piotr' and calls its 'main()', and thus 'Piotr',
> running 'main()', is the caller of 'hello()'.
>
> The class is loaded upon first reference to it or its members, but not
> necessarily initialized right then. *For example, a reference to 'Piotr..class'
> will load 'Piotr' if it wasn't already, but not initialize it.
>
> The invocation of 'main()' will cause class initialization, so that will have
> happened before the call to 'hello()'.
>
> --
> Lew




Hi guys,

Thanks, but this is not what I want; I would like something like the
program below. Basically references to live objects, not class
definition objects. It is for easier troubleshooting of an existing
large production system, if something sets up a bad status, I would
like to know what caused it, we have a lot of information in JMX
already to click through, but not real stacks - and you cannot really
debug a live production system.

By debugger I mean debugger, like Eclipse debugger - you can see all
stack frames, local variables in them, and "this" local to each stack
frame, so you see values of fields in each object in stack frames,
from your breakpoint location all the way up to top level Thread.run()
or similar.

Cheers,
Piotr

class A {
int i, j;
void a() {
i = 1;
j = 2;
aa();
}

void aa() {
B b = new B();
b.b(this);
}
}

class B {
void b(Object o) {
// assuming Magic.getStackFrame(thread, nextFrame - null means we are
asking for the last frame in stack)

// getting first from stack frame
Frame frame1 = Magic.getStackFrame(Thread.currentThread(), null);

// THIS IS WHAT I WANT TO RETRIEVE, FROM HERE
assert(frame1.objectRef == o);
assert(A.class.getDeclaredField("i").get(frame1.ob jectRef) == 1);
assert(A.class.getDeclaredField("j").get(frame1.ob jectRef) == 2);
// TO HERE

// we were called from no arg method - this is retrieveable from
// Thread.dumpStack() actually
assert(frame1.method.equals(A.class.getMethod("aa" , new Class[]
{Object.class})));

Frame frame2 = Magic.getStackFrame(Thread.currentThread(), frame1);
assert(frame2.objectRef == frame1.objectRef); // the same object,
also not retrievable using what I know
assert(frame2.objectRef == o);
assert(frame1.method.equals(A.class.getMethod("a", new Class[]{})));

Frame frame3 = Magic.getStackFrame(Thread.currentThread(), frame2);
assert(frame3.objectRef == null); // this method was called from
static method
assert(frame3.method.equals(C.getMethod("main"), new Class[]
{String[].class}));

Frame frame4 = Magic.getStackFrame(Thread.currentThread(), frame3);
assert(frame4 == null); // it was top level frame

// etc.
}
}

class C {
public static void main(String s[]) {
new A().a();
}
}
 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      11-28-2010
On 11/28/2010 11:52 AM, puchacz wrote:
> [...]
> Thanks, but this is not what I want; I would like something like the
> program below. Basically references to live objects, not class
> definition objects. It is for easier troubleshooting of an existing
> large production system, if something sets up a bad status, I would
> like to know what caused it, we have a lot of information in JMX
> already to click through, but not real stacks - and you cannot really
> debug a live production system.


I don't think you'll get what you want, short of running the
code under a debugger. Perhaps the java.lang.instrument package
would help -- but using those facilities seems pretty close to (and
as intrusive as) using a debugger to begin with.

--
Eric Sosman
lid
 
Reply With Quote
 
Roedy Green
Guest
Posts: n/a
 
      11-29-2010
On Fri, 26 Nov 2010 12:38:25 -0800 (PST), puchacz
<> wrote, quoted or indirectly quoted someone who
said :

>Is it possible to get a reference to caller object (and recursively
>all the way up the call stack)?


yes. You can all sorts of information.

See http://mindprod.com/jgloss/trace.html
for sample code.
--
Roedy Green Canadian Mind Products
http://mindprod.com

If you give your kitchen floor a quick steam mop every few days, you will find you never have to get out buckets and brushes for deep cleaning. Similary, if you keep your code tidy, refactoring as you go, you probably won't need major rewrites.
 
Reply With Quote
 
Arne Vajhøj
Guest
Posts: n/a
 
      11-30-2010
On 29-11-2010 12:54, Roedy Green wrote:
> On Fri, 26 Nov 2010 12:38:25 -0800 (PST), puchacz
> <> wrote, quoted or indirectly quoted someone who
> said :
>> Is it possible to get a reference to caller object (and recursively
>> all the way up the call stack)?

>
> yes. You can all sorts of information.
>
> See http://mindprod.com/jgloss/trace.html
> for sample code.


Two quick questions:

1) what is an object?

2) what of the code below

Throwable t = new Throwable();
StackTraceElement[] es = t.getStackTrace();
for ( int i=0; i<es.length; i++ )
{
StackTraceElement e = es[i];
System.out.println( " in class:" + e.getClassName()
+ " in source file:" + e.getFileName()
+ " in method:" + e.getMethodName()
+ " at line:" + e.getLineNumber()
+ " " + ( e.isNativeMethod() ? "native" : "" ) );
}

finds "caller object"?

Arne
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
"Object reference not set to an instance of an object" Weird thing happens with reference a link nguyentrongkha@gmail.com ASP .Net 1 09-20-2007 09:46 PM
Getting the 'Sender' or 'Caller' object of a method Peter Laurens Ruby 11 08-03-2007 08:14 PM
Created object on stack and then returned this object to caller. Item deleted but still there?? opistobranchia C++ 1 08-14-2005 07:51 PM
Getting the binding of the caller Michael Neumann Ruby 9 08-18-2004 10:53 AM
Can't get function caller if the caller is from a function within a popup window Mark Javascript 2 04-03-2004 07:57 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57