How to create a default constructor with ByteBuddy?
up vote
1
down vote
favorite
I use ByteBuddy and I have this code:
public class A extends B {
public A(String a) {
super(a);
}
public String getValue() {
return "HARDCODED VALUE";
}
}
public abstract class B {
private final String message;
protected B(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
My current generation code is:
Constructor<T> declaredConstructor;
try {
declaredConstructor = A.class.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
//fail with exception..
}
new ByteBuddy()
.subclass(A.class, Default.IMITATE_SUPER_CLASS)
.name(A.class.getCanonicalName() + "$Generated")
.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(declaredConstructor).with("message"))
.make()
.load(tClass.getClassLoader(),ClassLoadingStrategy.Default.WRAPPER)
.getLoaded()
.newInstance();
I want to get instance of class A, and also I want to make some actions in constructor after invoke super(), like this:
public A(){
super("message");
// do something special..
}
I tried implement with MethodDelegation.to(DefaultConstructorInterceptor.class), but I didn't succeed.
java code-generation byte-buddy
add a comment |
up vote
1
down vote
favorite
I use ByteBuddy and I have this code:
public class A extends B {
public A(String a) {
super(a);
}
public String getValue() {
return "HARDCODED VALUE";
}
}
public abstract class B {
private final String message;
protected B(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
My current generation code is:
Constructor<T> declaredConstructor;
try {
declaredConstructor = A.class.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
//fail with exception..
}
new ByteBuddy()
.subclass(A.class, Default.IMITATE_SUPER_CLASS)
.name(A.class.getCanonicalName() + "$Generated")
.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(declaredConstructor).with("message"))
.make()
.load(tClass.getClassLoader(),ClassLoadingStrategy.Default.WRAPPER)
.getLoaded()
.newInstance();
I want to get instance of class A, and also I want to make some actions in constructor after invoke super(), like this:
public A(){
super("message");
// do something special..
}
I tried implement with MethodDelegation.to(DefaultConstructorInterceptor.class), but I didn't succeed.
java code-generation byte-buddy
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I use ByteBuddy and I have this code:
public class A extends B {
public A(String a) {
super(a);
}
public String getValue() {
return "HARDCODED VALUE";
}
}
public abstract class B {
private final String message;
protected B(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
My current generation code is:
Constructor<T> declaredConstructor;
try {
declaredConstructor = A.class.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
//fail with exception..
}
new ByteBuddy()
.subclass(A.class, Default.IMITATE_SUPER_CLASS)
.name(A.class.getCanonicalName() + "$Generated")
.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(declaredConstructor).with("message"))
.make()
.load(tClass.getClassLoader(),ClassLoadingStrategy.Default.WRAPPER)
.getLoaded()
.newInstance();
I want to get instance of class A, and also I want to make some actions in constructor after invoke super(), like this:
public A(){
super("message");
// do something special..
}
I tried implement with MethodDelegation.to(DefaultConstructorInterceptor.class), but I didn't succeed.
java code-generation byte-buddy
I use ByteBuddy and I have this code:
public class A extends B {
public A(String a) {
super(a);
}
public String getValue() {
return "HARDCODED VALUE";
}
}
public abstract class B {
private final String message;
protected B(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
My current generation code is:
Constructor<T> declaredConstructor;
try {
declaredConstructor = A.class.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
//fail with exception..
}
new ByteBuddy()
.subclass(A.class, Default.IMITATE_SUPER_CLASS)
.name(A.class.getCanonicalName() + "$Generated")
.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(declaredConstructor).with("message"))
.make()
.load(tClass.getClassLoader(),ClassLoadingStrategy.Default.WRAPPER)
.getLoaded()
.newInstance();
I want to get instance of class A, and also I want to make some actions in constructor after invoke super(), like this:
public A(){
super("message");
// do something special..
}
I tried implement with MethodDelegation.to(DefaultConstructorInterceptor.class), but I didn't succeed.
java code-generation byte-buddy
java code-generation byte-buddy
edited Nov 9 at 10:36
asked Nov 9 at 7:45
Sergey
4015
4015
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
The JVM requires you to hard-code the super method call into a method what is not possible using delegation (also see the javadoc), this is why you cannot use the MethodDelegation to invoke the constructor. What you can do is to chain the method call you already have and the delegation by using composition by the andThen step as in:
MethodCall.invoke(declaredConstructor).with("message")
.andThen(MethodDelegation.to(DefaultConstructorInterceptor.class));
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
The JVM requires you to hard-code the super method call into a method what is not possible using delegation (also see the javadoc), this is why you cannot use the MethodDelegation to invoke the constructor. What you can do is to chain the method call you already have and the delegation by using composition by the andThen step as in:
MethodCall.invoke(declaredConstructor).with("message")
.andThen(MethodDelegation.to(DefaultConstructorInterceptor.class));
add a comment |
up vote
1
down vote
The JVM requires you to hard-code the super method call into a method what is not possible using delegation (also see the javadoc), this is why you cannot use the MethodDelegation to invoke the constructor. What you can do is to chain the method call you already have and the delegation by using composition by the andThen step as in:
MethodCall.invoke(declaredConstructor).with("message")
.andThen(MethodDelegation.to(DefaultConstructorInterceptor.class));
add a comment |
up vote
1
down vote
up vote
1
down vote
The JVM requires you to hard-code the super method call into a method what is not possible using delegation (also see the javadoc), this is why you cannot use the MethodDelegation to invoke the constructor. What you can do is to chain the method call you already have and the delegation by using composition by the andThen step as in:
MethodCall.invoke(declaredConstructor).with("message")
.andThen(MethodDelegation.to(DefaultConstructorInterceptor.class));
The JVM requires you to hard-code the super method call into a method what is not possible using delegation (also see the javadoc), this is why you cannot use the MethodDelegation to invoke the constructor. What you can do is to chain the method call you already have and the delegation by using composition by the andThen step as in:
MethodCall.invoke(declaredConstructor).with("message")
.andThen(MethodDelegation.to(DefaultConstructorInterceptor.class));
answered Nov 10 at 16:39
Rafael Winterhalter
27.3k1364142
27.3k1364142
add a comment |
add a comment |
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%2f53221636%2fhow-to-create-a-default-constructor-with-bytebuddy%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