Alfred
Alfred

Reputation: 101

Using User input for the reflection process in java

basically am trying to make java command prompt. Suppose user enters as input from the user:

new x java.util.ArrayList

here x is the object name and java.util.ArrayList is the class. So this script inputed by the user means create an object of class java.util.ArrayList.

Now suppose that user enter:

new x java.util.ArrayList int:5 

means create an object x of the java.util.ArrayList and make its size 5. Like this i want that everytime i input something related to object creation as input i should be able to create class its object and its method based on the input that the user does. Am new to java and reflection so kindly help! here is the code i thought so far using my mind:

 public static void token_classification() throws ClassNotFoundException
    {
        my_hash = new HashMap();
        Keep_Obj_Info = new HashMap();
        if(expression_keeper[0].equalsIgnoreCase("new"))
        {
           my_hash.put("Object", expression_keeper[1]);
           Class Obj= Class.forName(expression_keeper[2]);
           Keep_Obj_Info.put("Modifier", Obj.getModifiers());
           Keep_Obj_Info.put("Package",Obj.getPackage());
                ////????


           Constructor[] constructors = Obj.getConstructors();

        }
        else
        if(expression_keeper[0].equalsIgnoreCase("call"))
        {

        }
        else
        if(expression_keeper[0].equalsIgnoreCase("print"))
        {

        }
        else
        {
           System.out.println("Invalid Script!");
        }
    }

ExpressionKeeper is basically a String array that keeps the user input in tokenized form. Meaning anything next to a white space to a new location.

Upvotes: 0

Views: 524

Answers (2)

GKP
GKP

Reputation: 1087

Well for Object creation in java; the constructor and it's arguments are required. you can have a generic framework which will accept input from command prompt and interpret them means find out the data type of the input ex : number/string/char/boolean etc.. Also your framework should know the argument index for example say a constructor has 2 parameter and one is string and another is int. and say first parameter is int and 2nd parameter is String and while passing the parameter from the command line the user first pass string and then int in that scenario your program should be smart enough to properly arrange them in order. So many such things you need to take care of....Now coming to the example which you have mentioned for ArrayList you can write a program as follows : (I have just given you a pseudocode you can implement your own way)

{

           int howManyParametersFromCommandLine = getnoParameterCount;  //it will maintain no.of parameters passed from command line

           String[] parametersFromCommandLine  = getParametersFromcommandLine();  // Ex : {1,"ABC",new Double(80.0d)}; 

            List<Class>  parameterTypesList = parseParameters(parametersFromCommandLine); //This will identify type of each of the parameter


   Class  clazz = Class.forName("youClassName");

   Constructor[]  cons = clazz.getConstructors();

   for(Constructor c :  cons)

{ Class[] parameterTypes = c.getParameterTypes();

       if(parameterTypes.length == howManyParametersFromCommandLine)

       {
          //try to match the parameter type in parameterTypesList with parameterTypes if this matches then

           boolean typeMatchingAndSequecneSucess = matchParameters(parameterTypes,parameterTypesList);

           if(typeMatchingAndSequecneSucess)
           {
               if(c.isAccessible())
               {
                  Object[] initargs = parseAndRetActualParamValue(parametersFromCommandLine); 
                  return c.newInstance(initargs); 
               }
           }
       }

   }

}

Hope this will help you !!

Upvotes: 2

Giovani Guizzo
Giovani Guizzo

Reputation: 527

You may want to use the Interpreter design pattern. It is used just for that.
The Interpreter is a bit complex, but will ensure you code interpretation works right. Also, it gives you a easy inclusion of new commands.
Take a look at here: http://en.wikipedia.org/wiki/Interpreter_pattern
Hope I could help.

Upvotes: 1

Related Questions