2016-05-25 7 views
-1

マップとJavaリフレクションの両方で使用していたメソッドが動作しません。私は反射や他の理由のためにそれが確かではありませんが、私は反射を使用しなかった他のクラスで働いています。メソッドがリフレクションで動作していません

メソッドfindAccessors()は、map2から値を取得する必要があります。メソッドはクラスReadEdgesで定義されています。このメソッドは、FindMethodクラスで定義されている別のメソッドfindmethod()によって呼び出されます。

findmethod()メソッドでfindAccessors()メソッドを呼び出すときは、値をmap2から返す代わりに、空のリンクリストを返しています。クラスを以下に示す。

クラスReadEdges

import java.io.BufferedReader; 
import java.io.CharArrayReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.LinkedHashSet; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Map; 
import java.util.StringTokenizer; 
import java.util.regex.Pattern; 

import javax.swing.JOptionPane; 

public class ReadEdges { 
    static DFSclass dfs = new DFSclass(); 
    List<String> sourcenodes=new ArrayList<String>(); // source node 
    List<String> destinationnodes=new ArrayList<String>(); // destination node 
    LinkedHashSet<String> findtransitions=new LinkedHashSet<String>(); 
    LoanApprovalSystem LS = new LoanApprovalSystem(); 
    TestdataGeneration testdata = new TestdataGeneration(); 

    private static final String edgePat = "([a-zA-Z]|[0-9])+(,|\\x20)([a-zA-Z]|[0-9])+"; 
    private static final String start=dfs.getstart(); 
    private static final String edge = dfs.getedge(); 
    private static final String transitions=dfs.gettransitions(); 
    public static String a; 
    public static String b; 
    public static String c; 
    public static String d; 
    private Map<String, LinkedHashSet<String>> map = new HashMap(); 
    private Map<String, LinkedHashSet<String>> map2 = new HashMap(); 

    public int getLineCount(String edge){ 
     int count = edge.split("[\n|\r]").length; 
     //System.out.println(count); 
      return count; 
     } 


    public void addEdge(String node1, String node2) throws IOException{ 

     LinkedHashSet<String> adjacent = map.get(node1); 
     { 
      if(adjacent==null) { 
       adjacent = new LinkedHashSet(); 
       map.put(node1, adjacent); 
      } 
      adjacent.add(node2);    
     } 

     } 

    public void addedgeandAccessor(String edge, String accessor) throws IOException{ 
     LinkedHashSet<String> adjacent2 = map2.get(edge); 
     { 
      if(adjacent2==null) { 
       adjacent2 = new LinkedHashSet(); 
       map2.put(edge, adjacent2); 
       //System.out.println(map2); 
      } 

      adjacent2.add(accessor); 
      //System.out.println(map2); 
     } 
    } 

    public void ReadEdge(String edgeinput,String transitionsinput,String accessorinput) throws InvalidInputException 
    { 
     char[] buf = edgeinput.toCharArray(); 
     BufferedReader br = new BufferedReader(new CharArrayReader(buf)); 

     char[] buf2 = transitionsinput.toCharArray(); 
     BufferedReader br2 = new BufferedReader(new CharArrayReader(buf2));  
     String str2 = null; 

     char[] buf3 = accessorinput.toCharArray(); 
     BufferedReader br3 = new BufferedReader(new CharArrayReader(buf3));  
     String str3 = null; 

     try 
     { 
      //a string for a next edge 
      String str = null; 
      //a StringTokinizer 
      StringTokenizer newNodes = null; 
      //get edges and set edges for the graph 
      while((((str = br.readLine()) != null) && (str2 = br2.readLine()) != null) && ((str3 = br3.readLine()) != null)) 
      { 
       c=str; 
       d=str2; 


       LinkedHashSet<String> adjacent = map.get(str); 
       if(adjacent==null) { 
        adjacent = new LinkedHashSet(); 
        map.put(str, adjacent); 
       } 
       adjacent.add(str2); 

       addedgeandAccessor(str,str3); 

       //if the edge inputs are not in good format, throw the exception 
       if(!Pattern.matches(edgePat, str.trim())) 
        JOptionPane.showMessageDialog(null,"An invalid input '" + str + "' for an edge. Please read the notes above the forms. "); 
       //use a comma to separate tokens 
       newNodes = new StringTokenizer (str, ", "); 
       //get the value of source node of an edge 
       String src = newNodes.nextToken(); 
       //create the source node and destination node 
       String srcNode = src; 
       String desNode = newNodes.nextToken(); 

       a=srcNode; 
       b=desNode; 


       addEdge(srcNode, desNode); 
       //System.out.println(adjacent);    
       //findTransition(a,b); 
       //findAccessors(a,b); 

      } 

      //System.out.println(listoftransitions); 
     } 
      catch (IOException e) { 
       JOptionPane.showMessageDialog(null, "Something is Wrong!"); 
       e.printStackTrace(); 
      } 
} 


    public LinkedList<String> adjacentNodes(String last) { 
     LinkedHashSet<String> adjacent = map.get(last); 
     if(adjacent==null) { 
      return new LinkedList(); 
     } 
     return new LinkedList<String>(adjacent); 

    } 

    public LinkedList<String> findTransition(String node1, String node2) throws IOException{ 

      LinkedHashSet<String> adjacent = map.get(node1+" "+node2); 
      if(adjacent==null) { 
       return new LinkedList(); 
      } 
      findtransitions = adjacent; 
     return new LinkedList<String>(findtransitions); 

    } 

    public LinkedList<String> findAccessors(String node1, String node2) { 
     LinkedHashSet<String> adjacent = map2.get(node1+" "+node2); 
     if(adjacent==null) { 
      return new LinkedList(); 
     } 
     System.out.println(adjacent); 
     return new LinkedList<String>(adjacent); 

    } 

public String getsrcNode(){ 
    return a; 
} 

public String getedgeline(){ 
    return c; 
} 

public String gettransitionline(){ 
    return d; 
} 

} 

をクラスFindMethod:私の方法findAccessors()は法findmethod()内で作業されていない理由を

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.lang.reflect.*; 

public class FindMethod { 

    ReadEdges r = new ReadEdges(); 
    LoanApprovalSystem LS = new LoanApprovalSystem(); 
    TestdataGeneration testdata = new TestdataGeneration(); 


    int method1; 
    String method2; 
    boolean method3; 
    boolean method4; 
    String method5; 
    String m; 


    //returns the method name using refletion 
    public String getmethod(Method method){ 

     FindMethod fm = new FindMethod(); 
      m = method.getName();   
      String str = "";   

       str += m+"(" +fm.getparameter(method)+ ")"; 
       // System.out.println(str); 

      return str; 
    } 


    //returns the parameter name of the method using refletion (i.e. (int)) 
    public String getparameter(Method method){ 

     String str = ""; 
     Class<?>[] params = method.getParameterTypes(); 
     for (int i = 0; i < params.length; i++) { 
      if (i > 0) { 
       str += ", "; 
      } 
      str += (params[i].getSimpleName()); 
     } 
     return str; 
    } 

public void findmethod(String s,String t,String transition) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ 

     FindMethod fm = new FindMethod(); 


     LoanApprovalSystem cls = new LoanApprovalSystem(); 
     Class<? extends LoanApprovalSystem> c = cls.getClass(); 
     Object obj = c.newInstance(); 
     Method[] methods = LoanApprovalSystem.class.getMethods(); 


      for(Method method : methods) 
      { 
       //returns the method name (i.e. Receive or Asses) 
       m = method.getName(); 
       fm.getmethod(method); 


     if(transition.equals(fm.getmethod(method)) && (transition.equals("Receive(int)"))) 
     { 
      if(fm.getparameter(method).equals("int")) 
      { 
       //LS.Receive(testdata.TestData(s,t)); 
       //invoking the method at runtime where m="Receive". 

       method = c.getMethod(m, int.class); 
       method.invoke(obj,testdata.TestData(s,t)); 

       LinkedList<String> accessors= r.findAccessors(s,t); 
       System.out.println("A:"+accessors); 

       method1=LS.getamount(); 

       System.out.println(m+"("+method1+")"); 
       System.out.println("Amount: "+method1); 
      } 
     } 

} 
    } 

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException 
    { 
     FindMethod fm = new FindMethod(); 
     fm.findmethod("1","2","Receive(int)"); 
    } 
} 

誰も教えてくださいことはできますか?または、私にこの問題の解決策を教えてください。

注:このプログラムでは別のクラスが使用されていますLoanApprovalSystem()。もし誰かが必要なら、私はそのクラスの定義を与えることもできます。

答えて

0
あなたはReadEdgesのデフォルトコンストラクタ呼び出しているように見えます

'ReadEdgesのR =新しいReadEdgesを();'

あなたがマップ移入あなたのコンストラクタを呼び出す必要がある場合:

'ReadEdgesをR =新しいReadEdges(edgeinput、transitionsinput、accessorinput);'

編集: 関数 public void ReadEdge(String edgeinput, String transitionsinput, String accessorinput);は決して呼び出されません。

あなたはvoidを削除し、それコンストラクタ作るためにReadEdgeに「S」として追加する必要があります。 public ReadEdges(String edgeinput, String transitionsinput, String accessorinput);

その後、あなたはFindMethodクラスでReadEdgesをインスタンス化するとき、あなたは引数を指定する必要があります。

ReadEdges r = new ReadEdges(); 次のようになります。詳細については ReadEdges r = new ReadEdges(edgeinput, transitionsinput, accessorinput);

、 'コンストラクタのオーバーロード' と 'メソッドのオーバーロード' についてお読みください。 http://beginnersbook.com/2013/05/constructor-overloading/

+0

あなたはもっと具体的になりますか?どのようにこれを行うには、または私はこれを呼び出す必要がありますか?あなたは私に例を教えてくれますか? – Hasan

+0

私はより多くの情報で私の答えを更新しました。あなたはmap2を設定している "ReadEdge"関数を呼び出していることを確認する必要があります。 – Echo

関連する問題