With reflection you can create a object using a constructor with arguments. Bellow is the code for you can check and understand how it works :
First I created a class and an interface class to do this example :
Interface :
public interface InterfaceTest {
}
Class:
public class MyClassTest implements InterfaceTest{
private String A;
private String B;
private String C;
// Look : Now we don't have more a constructor without params.
public MyClassTest(String a, String b, String c) {
A = a;
B = b;
C = c;
}
public String getA() {
return A;
}
public void setA(String a) {
A = a;
}
public String getB() {
return B;
}
public void setB(String b) {
B = b;
}
public String getC() {
return C;
}
public void setC(String c) {
C = c;
}
// This implementation is to print all values
// when we write System.out.println() setting the object like param.
// If you don't know always when we print a object, the method
// that is called is the toString() of this object.
@Override
public String toString() {
return "MyClassTest{" +
"A='" + A + '\'' +
", B='" + B + '\'' +
", C='" + C + '\'' +
'}';
}
}
Here you will see the same classMap that I used in the older posts. Also, now we have a new method implemented. In this method we will receive the constructor params.
public class ClassMap{
private Map<String,String> map;
public void setMap(Map<String, String> map) {
this.map = map;
}
// Here we do the loading of the class and return
public Class getClass(String keyClass) throws Exception{
String v = map.get(keyClass);
if(v != null){
return Class.forName(v);
}else{
throw new RuntimeException("Not found with this key");
}
}
// To create new instance of a object with values
public <E> E getObjectWithParams(String keyClass, Object... params) throws Exception {
Class<E> myClassImplementation = getClass(keyClass);
Class<?>[] constructorTypes = new Class<?>[params.length];
// Get the types of params
for(int i=0; i < constructorTypes.length; i++ ){
constructorTypes[i] = params[i].getClass();
}
// Create the constructor by quantity and types of params
Constructor<?> constructor = myClassImplementation.getConstructor(constructorTypes);
return (E) constructor.newInstance(params);
}
}
Calling this code :
@Test
public void testClassMap(){
ClassMap classMap = new ClassMap();
Map<String, String> myMap = new HashMap<String, String>();
myMap.put("InterfaceTest","MyClassTest");
classMap.setMap(myMap);
try {
String[] values = {"A","B","C"}; // The values for the constructor
MyClassTest myOjectWithValues = classMap.getObjectWithParams("InterfaceTest", values);
System.out.println(myOjectWithValues);
}catch (Exception r){
System.out.println(r);
}
}
Result / Console :
