I have this hard requirement that one of my classes, ClassX
is instantiated in a reflective manner by a third party module Modul3P
, calling ClassX
‘s default constructor. Then, Modul3P
calls one of the instance’s method, aMethod()
:
<code>//inaccessible, approximate code
void Modul3P(String className) {
Class<?> clazz = Class.forName(className);
InterfaceX object = (InterfaceX) clazz.newInstance();
object.aMethod();
}
interface InterfaceX {
void aMethod();
}
</code>
<code>//inaccessible, approximate code
void Modul3P(String className) {
Class<?> clazz = Class.forName(className);
InterfaceX object = (InterfaceX) clazz.newInstance();
object.aMethod();
}
interface InterfaceX {
void aMethod();
}
</code>
//inaccessible, approximate code
void Modul3P(String className) {
Class<?> clazz = Class.forName(className);
InterfaceX object = (InterfaceX) clazz.newInstance();
object.aMethod();
}
interface InterfaceX {
void aMethod();
}
My ClassX
, however, depends badly a parameter to be properly set up:
<code>class ClassX implements InterfaceX {
ClassX(Object param){...} //required for proper setup
ClassX(){...}; //called by Modul3P
void aMethod(){...}
}
</code>
<code>class ClassX implements InterfaceX {
ClassX(Object param){...} //required for proper setup
ClassX(){...}; //called by Modul3P
void aMethod(){...}
}
</code>
class ClassX implements InterfaceX {
ClassX(Object param){...} //required for proper setup
ClassX(){...}; //called by Modul3P
void aMethod(){...}
}
How do I overcome this issue?
My failed attempt (with Javassist) was to create a proper instance inst
, then create on-the-fly a class derived from ClassX
, which can be default-initialised, and which during initialisation would be injected inst
:
<code>class ClassX implements InterfaceX {
//...
Class<? extends ClassX> defaultConstructibleOnTheFlyClass(){...}
}
//...
ClassX inst = new ClassX(aParam); //proper initialisation
Modul3P(inst.defaultConstructibleOnTheFlyClass().getName());
</code>
<code>class ClassX implements InterfaceX {
//...
Class<? extends ClassX> defaultConstructibleOnTheFlyClass(){...}
}
//...
ClassX inst = new ClassX(aParam); //proper initialisation
Modul3P(inst.defaultConstructibleOnTheFlyClass().getName());
</code>
class ClassX implements InterfaceX {
//...
Class<? extends ClassX> defaultConstructibleOnTheFlyClass(){...}
}
//...
ClassX inst = new ClassX(aParam); //proper initialisation
Modul3P(inst.defaultConstructibleOnTheFlyClass().getName());