2017-11-19 2 views
-1

Ich versuche, verschiedene Methoden aus einer Klasse dynamisch aufzurufen.Java-Reflektion: Aufruf Methoden mit verschiedenen Argument dynamisch

detFunctions.java:

package detFunctions; 

import java.lang.reflect.*; 
import java.sql.*; 

public class detFunctions{ 
    public static void main(String[] args) throws Exception { 
    String funcId = ""; 
    String funcName = ""; 
    String funcDesc = ""; 
    String Input = ""; 
    try{ 
     System.out.println("Retrieving Function for Execution...."); 

     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     Connection con=DriverManager.getConnection("jdbc:oracle:thin:@192.168.168.4:2921:SCRDEV","custom","custom"); 
     Statement stmt=con.createStatement(); 
     ResultSet rs=stmt.executeQuery("select FUNC_IDENTIFIER,FUNC_NAME,FUNC_DESC from custom.dfmt"); 
     Input = "10001|10002|10003"; 
     while(rs.next()){ 
      funcId = rs.getString("FUNC_IDENTIFIER"); 
      funcName = rs.getString("FUNC_NAME"); 
      funcDesc = rs.getString("FUNC_DESC");  
     } 
     con.close(); 
     System.out.println("Function execution completed!!!"); 
    } catch (Exception e){ System.out.println(e);} 
    System.out.println(funcId); 
    System.out.println(funcName); 
    System.out.println(funcDesc); 
    System.out.println(Input); 

    //Reflection of DETFunctions (Raw Type) 
    String classId = "detFunctions.detFuncSet1"; 
    Class c = Class.forName(classId); 
    Method m = c.getDeclaredMethod(funcId, new Class[] {String.class}); 
    Object i = c.newInstance(); 
    Object funcOutput = m.invoke(i, Input); 
    System.out.println(funcOutput); 


    //Reflection of DETFunctions (Generic Type) 

    } //End of Main Function 
} //End of class 
    *

detFuncSet1.java:

package detFunctions; 

public class detFuncSet1 { 

    public double GL_BALANCE(String GLList) { 
     System.out.println("GL_BALANCE Method invoked......."); 
     double GLBalance = 5005689.50; 
     System.out.println("GL_BALANCE Method execution completed....."); 
     return GLBalance; 
    } 

    public double EFF_BALANCE(String AcctNo,String InDate) { 
     System.out.println("EFF_BALANCE Method invoked......."); 
     double EFFBalance = 500.50; 
     System.out.println("EFF_BALANCE Method execution completed....."); 
     return EFFBalance; 
    } 
} 

Hier Ich versuche Methoden aus detFuncSet1 Klasse auszuführen Refection verwenden. Aber getDeclaredMethod ist ein roher Typ, so dass ich die Eingaben verschiedener Typen nicht an die Methoden übergeben kann.

Im obigen Code hat getDeclaredMethod Argumente, die den Parameter type sind. Basierend auf der Abfrage, die ich ausführe, erstelle ich die Funktion funcId (was mein Methodenname ist). Da meine Methoden (in der Klasse detFuncSet1-Klasse) unterschiedliche Eingaben haben, kann ich den Parametertyp nicht dynamisch an getDeclaredMethod übergeben. Gibt es eine Möglichkeit, meine Methoden dynamisch auszuführen?

+0

Welche Art von Programm ist das? Sie folgen nicht dem Java-Style-Guide (z. B. Variablennamen in Kleinbuchstaben), was ziemlich verwirrend ist. Was ist die 'Input'-Variable für? Es enthält eine "pipe" getrennte Zeichenfolge ('|'). Soll es aufgeteilt werden? –

+0

Das war ein Eingang, den ich für die Methode GL_BALANCE hart codiert habe. Entschuldigung, dass ich nicht dem Java Style Guide folge. –

+0

Der Name der Methode ist 'EFF_BALANCE' und erfordert zwei Argumente. Ich denke, das ist das größte Problem mit Ihrem Programm. Sie müssen herausfinden, wie viele Argumente für jede Methode übergeben werden müssen. Im Allgemeinen ist das, was Sie versuchen, ein großes Sicherheitsrisiko. –

Antwort

0

Mit Reflektion verlieren Sie die Typensicherheit. Wenn Sie eine Methode aufrufen, übergeben Sie einfach ein Object[] Array.

Verwandte Themen