java - 动态创建对象时未找到类 - Java

标签 java

我创建了一个 Java 程序,它读取文件,并使用 Java 中的 Reflection API 确定要执行的操作(创建对象、调用类的方法)。 例如:

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 中执行此类任务,所以我不是很熟悉......有人可以帮助我吗?是缺少库还是类似的东西? 谢谢

最佳答案

您需要在类路径中设置要调用的类的所有库以及这些类的所有依赖项。因此,在这种情况下,org.powertac.common.Competition 似乎依赖于 org.aspectj.lang.Signature。

关于java - 动态创建对象时未找到类 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12151041/

相关文章:

java - 如何构建这个源代码? - 缺少依赖

java - 文档中的 dom4j XML 声明

java - java中的 vector 矩阵乘法与并行colt

java - 将对象传递给另一个 Activity (没有 Parcelable?)

java - Vaadin Spring Boot 找不到 npm 包

java - Apache 弗林克 : Standalone Cluster tries to connect with username "flink"

java - java 上的鼠标中键无法正常工作

java - 遵循 arquillian-graphene 指南的问题

java - java google app engine中的多对多关系

java - 在二十一点中检查双下