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