2012-08-27 18 views
0

我創建了一個Java程序,它讀取一個文件,並使用Java中的Reflection API指出要執行哪個操作(創建對象,調用類的方法)。 例如:動態創建對象時未找到類 - Java

2234:org.powertac.common.Rate::9::new 
2234:org.powertac.common.Rate::9::withValue::-0.5 

,如果我找到new關鍵字,然後我試圖創建類的新對象。否則,我將使用參數-0.5來調用方法(在示例中爲withValue())。 源代碼如下所示:

// 
// program created a map between int and string 
// 
import java.util.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.io.*; 
import java.lang.reflect.*; 
import org.powertac.common.*; 
import org.powertac.util.*; 

public class Parser { 

    private String filename; 
    private Map< Integer, Object > map; 
    // 
    // just the default constructor is needed for now 
    // 
    public Parser(){ 
     this.map = new HashMap< Integer, Object >(); 
     this.filename = "/home/phillipe/powertac/powertac-server/" + 
         "server-distribution/log/powertac-boot.state"; 
    } 
    // 
    // override the default constructor 
    // 
    public Parser(String filename){ 
     this.filename = filename; 
    } 

    public void parse() throws ClassNotFoundException{ 
     try{ 
      // 
      // assure file exists before parsing 
      // 
      FileReader fr = new FileReader(this.filename); 
      BufferedReader textReader = new BufferedReader(fr); 
      String line; 
      Integer id = 1; 
      while((line = textReader.readLine()) != null){ 
       Pattern p = Pattern.compile("([^:]+):([^:]+)::([\\d]+)::([^:]+)::(.+)"); 
       Matcher m = p.matcher(line); 
       if (m.find()) { 
        //String id = m.group(1); 
        String className = m.group(2); 
        int orderOfExecution = Integer.valueOf(m.group(3)); 
        String methodNameOrNew = m.group(4); 
        Object[] arguments = m.group(5).split("::"); 

        if(methodNameOrNew.compareTo("new") == 0){ 
         System.out.println("Loading class: " + className); 
         Competition cc = null; 


         if(className.contains("Competition")){ 
          this.map.put(id, cc); 
         } 
         else if(className.contains("LocalBroker")){ 
          continue; 
         } 
         else { 
          Class<?> cl = Class.forName(className); 
          Constructor<?> cons = cl.getConstructor(String.class); 
          Object obj = cons.newInstance(arguments); 
          this.map.put(id , obj); 
         } 

        } 
        else{ 
         Class<?> cl = Class.forName(className); 
         Method method = cl.getMethod(methodNameOrNew, String.class); 
         this.map.put(id, method); 
        } 
        id++; 
        System.out.printf("%s %s %d %s %d\n", id, className, orderOfExecution, methodNameOrNew, arguments.length); 
       } 
      } 
      textReader.close(); 
     } 
     catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
     catch(ArrayIndexOutOfBoundsException ex){ 
      ex.printStackTrace(); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    public void print(){ 
     Iterator<?> iterator = this.map.keySet().iterator(); 

     while (iterator.hasNext()) { 
      String key = iterator.next().toString(); 
      String value = this.map.get(key).toString(); 

      System.out.println(key + " " + value); 
     } 
    } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Parser parse = new Parser(); 
     try { 
      parse.parse(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     System.exit(0); 

    } 

} 

但是,我發現了以下錯誤:

Loading class: org.powertac.common.Competition 
2 org.powertac.common.Competition 0 new 1 
Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/lang/Signature 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:186) 
    at Parser.parse(Parser.java:71) 
    at Parser.main(Parser.java:123) 
Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.Signature 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 

予加載的.jar文件含有類的二進制文件。這是我第一次在Java做這種任務,所以我不是很熟悉....有人可以幫我嗎?這是一個缺少的圖書館或類似的東西嗎? THanks

+1

加載廣口瓶中,你的IDE的項目並不總是加載或將其設置到classpath中。在這種情況下,您的某個對象似乎對某些AspectJ類具有不同的依賴關係。嘗試找到錯過使用此網站的jar文件:http://findjar.com/index.x – gersonZaragocin

回答

1

該類org.aspectj.lang.Signature是Aspectj運行時庫的一部分。如果您使用的是Maven,您可以添加:

<dependency> 
    <groupId>aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.5.4</version> 
</dependency> 

到您的POM.xml以檢索缺少的JAR文件。

或直接:

aspectjrt-1.5.4.jaraspectjweaver-1.5.4.jarlog4j

+0

但我沒有POM.xml文件...我怎麼能解決這些依賴關係? – cybertextron

+0

我已經添加了2個直接鏈接。下載並添加到你的類路徑。 – Reimeus

+0

還有一個要走: 'org/apache/log4j/Logger' – cybertextron

2

您需要在您的類路徑中設置所有您要調用的類的庫以及這些類的所有依賴關係。因此,在這種情況下,似乎org.powertac.common.Competition對org.aspectj.lang.Signature具有依賴性。