Java Proxy invoke for nested calls
I'm having problems implementing a Proxy for a class that has to print the stacktrace for every call on a function of a class, because the functions are nested one with the other.
The problem is very similar if not the same to one another user had, the answers helped me to understand how to approach it but still I can't manage to solve it ( Dynamic Proxy: how to handle nested method calls ).
I've a class :
public class NestedCalls implements INestedCalls{
private int i = 0;
public int a() {
return b(i++);
}
public int b(int a) {
return (i<42)?c(b(a())):1;
}
public int c(int a) {
return --a;
}
}
and its interface:
public interface INestedCalls {
public int a() ;
public int b(int a) ;
public int c(int a) ;
}
The handler I implemented looks like this:
public class NestHandler implements InvocationHandler {
Object base;
public NestHandler(Object base) {
this.base=base;
}
@Override
public Object invoke(Object proxy, Method method, Object args) throws Throwable {
Object result = method.invoke(base, args);
printNest();
return result;
}
private void printNest() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
StackTraceElement stack = new Throwable().getStackTrace();
System.out.println("num of elem " + stack.length);
for(int i=0; i<stack.length; i++) {
System.out.println("elem "+i+": "+stack[i]);
}
}
}
What I aim to do is to initialize the object and the proxy from my main and after invoking a method I expect to print the stacktrace every time a method of the class is invoked.
INestedCalls nestedcalls = new ENestedCalls();
INestedCalls nestproxy = (INestedCalls) Proxy.newProxyInstance(nestedcalls.getClass().getClassLoader(), nestedcalls.getClass().getInterfaces(), new NestHandler(nestedcalls));
nestproxy.a();
To my understanding this doesn't work because the proxy handles everything with a intra-object and so the nested methods are not called with the proxy interface.
How can I get the effect I want without touching the code of the class?
java nested dynamic-proxy
add a comment |
I'm having problems implementing a Proxy for a class that has to print the stacktrace for every call on a function of a class, because the functions are nested one with the other.
The problem is very similar if not the same to one another user had, the answers helped me to understand how to approach it but still I can't manage to solve it ( Dynamic Proxy: how to handle nested method calls ).
I've a class :
public class NestedCalls implements INestedCalls{
private int i = 0;
public int a() {
return b(i++);
}
public int b(int a) {
return (i<42)?c(b(a())):1;
}
public int c(int a) {
return --a;
}
}
and its interface:
public interface INestedCalls {
public int a() ;
public int b(int a) ;
public int c(int a) ;
}
The handler I implemented looks like this:
public class NestHandler implements InvocationHandler {
Object base;
public NestHandler(Object base) {
this.base=base;
}
@Override
public Object invoke(Object proxy, Method method, Object args) throws Throwable {
Object result = method.invoke(base, args);
printNest();
return result;
}
private void printNest() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
StackTraceElement stack = new Throwable().getStackTrace();
System.out.println("num of elem " + stack.length);
for(int i=0; i<stack.length; i++) {
System.out.println("elem "+i+": "+stack[i]);
}
}
}
What I aim to do is to initialize the object and the proxy from my main and after invoking a method I expect to print the stacktrace every time a method of the class is invoked.
INestedCalls nestedcalls = new ENestedCalls();
INestedCalls nestproxy = (INestedCalls) Proxy.newProxyInstance(nestedcalls.getClass().getClassLoader(), nestedcalls.getClass().getInterfaces(), new NestHandler(nestedcalls));
nestproxy.a();
To my understanding this doesn't work because the proxy handles everything with a intra-object and so the nested methods are not called with the proxy interface.
How can I get the effect I want without touching the code of the class?
java nested dynamic-proxy
That code should work just fine.
– Sotirios Delimanolis
Nov 22 at 18:46
The code itself works but not in the way I imagined. What I would like to do is to have the invoke function to print the stack even when b(int a) and c(int a) are called from nestproxy.a(), but it prints only once.
– Jing
Nov 22 at 19:23
Oh you can't do that easily. You'd have to always go through the proxy, instead of directly callingthis.b(...);
. You might want to look into AspectJ's AOP implementation for a "better" solution.
– Sotirios Delimanolis
Nov 22 at 19:48
Thanks for the answer. I had a look at AspectJ and it should be the best way to solve this problem, however I was wondering if it was possible without using it. I thought about extending my NestedCalls class and to override the methods in a way that they would call the proxy but I can't manage to write a code that works or goes in a loop.
– Jing
Nov 23 at 11:10
add a comment |
I'm having problems implementing a Proxy for a class that has to print the stacktrace for every call on a function of a class, because the functions are nested one with the other.
The problem is very similar if not the same to one another user had, the answers helped me to understand how to approach it but still I can't manage to solve it ( Dynamic Proxy: how to handle nested method calls ).
I've a class :
public class NestedCalls implements INestedCalls{
private int i = 0;
public int a() {
return b(i++);
}
public int b(int a) {
return (i<42)?c(b(a())):1;
}
public int c(int a) {
return --a;
}
}
and its interface:
public interface INestedCalls {
public int a() ;
public int b(int a) ;
public int c(int a) ;
}
The handler I implemented looks like this:
public class NestHandler implements InvocationHandler {
Object base;
public NestHandler(Object base) {
this.base=base;
}
@Override
public Object invoke(Object proxy, Method method, Object args) throws Throwable {
Object result = method.invoke(base, args);
printNest();
return result;
}
private void printNest() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
StackTraceElement stack = new Throwable().getStackTrace();
System.out.println("num of elem " + stack.length);
for(int i=0; i<stack.length; i++) {
System.out.println("elem "+i+": "+stack[i]);
}
}
}
What I aim to do is to initialize the object and the proxy from my main and after invoking a method I expect to print the stacktrace every time a method of the class is invoked.
INestedCalls nestedcalls = new ENestedCalls();
INestedCalls nestproxy = (INestedCalls) Proxy.newProxyInstance(nestedcalls.getClass().getClassLoader(), nestedcalls.getClass().getInterfaces(), new NestHandler(nestedcalls));
nestproxy.a();
To my understanding this doesn't work because the proxy handles everything with a intra-object and so the nested methods are not called with the proxy interface.
How can I get the effect I want without touching the code of the class?
java nested dynamic-proxy
I'm having problems implementing a Proxy for a class that has to print the stacktrace for every call on a function of a class, because the functions are nested one with the other.
The problem is very similar if not the same to one another user had, the answers helped me to understand how to approach it but still I can't manage to solve it ( Dynamic Proxy: how to handle nested method calls ).
I've a class :
public class NestedCalls implements INestedCalls{
private int i = 0;
public int a() {
return b(i++);
}
public int b(int a) {
return (i<42)?c(b(a())):1;
}
public int c(int a) {
return --a;
}
}
and its interface:
public interface INestedCalls {
public int a() ;
public int b(int a) ;
public int c(int a) ;
}
The handler I implemented looks like this:
public class NestHandler implements InvocationHandler {
Object base;
public NestHandler(Object base) {
this.base=base;
}
@Override
public Object invoke(Object proxy, Method method, Object args) throws Throwable {
Object result = method.invoke(base, args);
printNest();
return result;
}
private void printNest() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
StackTraceElement stack = new Throwable().getStackTrace();
System.out.println("num of elem " + stack.length);
for(int i=0; i<stack.length; i++) {
System.out.println("elem "+i+": "+stack[i]);
}
}
}
What I aim to do is to initialize the object and the proxy from my main and after invoking a method I expect to print the stacktrace every time a method of the class is invoked.
INestedCalls nestedcalls = new ENestedCalls();
INestedCalls nestproxy = (INestedCalls) Proxy.newProxyInstance(nestedcalls.getClass().getClassLoader(), nestedcalls.getClass().getInterfaces(), new NestHandler(nestedcalls));
nestproxy.a();
To my understanding this doesn't work because the proxy handles everything with a intra-object and so the nested methods are not called with the proxy interface.
How can I get the effect I want without touching the code of the class?
java nested dynamic-proxy
java nested dynamic-proxy
asked Nov 22 at 18:41
Jing
184
184
That code should work just fine.
– Sotirios Delimanolis
Nov 22 at 18:46
The code itself works but not in the way I imagined. What I would like to do is to have the invoke function to print the stack even when b(int a) and c(int a) are called from nestproxy.a(), but it prints only once.
– Jing
Nov 22 at 19:23
Oh you can't do that easily. You'd have to always go through the proxy, instead of directly callingthis.b(...);
. You might want to look into AspectJ's AOP implementation for a "better" solution.
– Sotirios Delimanolis
Nov 22 at 19:48
Thanks for the answer. I had a look at AspectJ and it should be the best way to solve this problem, however I was wondering if it was possible without using it. I thought about extending my NestedCalls class and to override the methods in a way that they would call the proxy but I can't manage to write a code that works or goes in a loop.
– Jing
Nov 23 at 11:10
add a comment |
That code should work just fine.
– Sotirios Delimanolis
Nov 22 at 18:46
The code itself works but not in the way I imagined. What I would like to do is to have the invoke function to print the stack even when b(int a) and c(int a) are called from nestproxy.a(), but it prints only once.
– Jing
Nov 22 at 19:23
Oh you can't do that easily. You'd have to always go through the proxy, instead of directly callingthis.b(...);
. You might want to look into AspectJ's AOP implementation for a "better" solution.
– Sotirios Delimanolis
Nov 22 at 19:48
Thanks for the answer. I had a look at AspectJ and it should be the best way to solve this problem, however I was wondering if it was possible without using it. I thought about extending my NestedCalls class and to override the methods in a way that they would call the proxy but I can't manage to write a code that works or goes in a loop.
– Jing
Nov 23 at 11:10
That code should work just fine.
– Sotirios Delimanolis
Nov 22 at 18:46
That code should work just fine.
– Sotirios Delimanolis
Nov 22 at 18:46
The code itself works but not in the way I imagined. What I would like to do is to have the invoke function to print the stack even when b(int a) and c(int a) are called from nestproxy.a(), but it prints only once.
– Jing
Nov 22 at 19:23
The code itself works but not in the way I imagined. What I would like to do is to have the invoke function to print the stack even when b(int a) and c(int a) are called from nestproxy.a(), but it prints only once.
– Jing
Nov 22 at 19:23
Oh you can't do that easily. You'd have to always go through the proxy, instead of directly calling
this.b(...);
. You might want to look into AspectJ's AOP implementation for a "better" solution.– Sotirios Delimanolis
Nov 22 at 19:48
Oh you can't do that easily. You'd have to always go through the proxy, instead of directly calling
this.b(...);
. You might want to look into AspectJ's AOP implementation for a "better" solution.– Sotirios Delimanolis
Nov 22 at 19:48
Thanks for the answer. I had a look at AspectJ and it should be the best way to solve this problem, however I was wondering if it was possible without using it. I thought about extending my NestedCalls class and to override the methods in a way that they would call the proxy but I can't manage to write a code that works or goes in a loop.
– Jing
Nov 23 at 11:10
Thanks for the answer. I had a look at AspectJ and it should be the best way to solve this problem, however I was wondering if it was possible without using it. I thought about extending my NestedCalls class and to override the methods in a way that they would call the proxy but I can't manage to write a code that works or goes in a loop.
– Jing
Nov 23 at 11:10
add a comment |
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53436618%2fjava-proxy-invoke-for-nested-calls%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53436618%2fjava-proxy-invoke-for-nested-calls%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
That code should work just fine.
– Sotirios Delimanolis
Nov 22 at 18:46
The code itself works but not in the way I imagined. What I would like to do is to have the invoke function to print the stack even when b(int a) and c(int a) are called from nestproxy.a(), but it prints only once.
– Jing
Nov 22 at 19:23
Oh you can't do that easily. You'd have to always go through the proxy, instead of directly calling
this.b(...);
. You might want to look into AspectJ's AOP implementation for a "better" solution.– Sotirios Delimanolis
Nov 22 at 19:48
Thanks for the answer. I had a look at AspectJ and it should be the best way to solve this problem, however I was wondering if it was possible without using it. I thought about extending my NestedCalls class and to override the methods in a way that they would call the proxy but I can't manage to write a code that works or goes in a loop.
– Jing
Nov 23 at 11:10