问个问题啊,这个东西是在Eclips做的,问题简述: 有一文件 shop.java, 会生成两个文件,problem.txt与domain.txt, 并且shop.java会调用 A.jar 中的一个类。 被调用的类是InternalDomain。 在调用InternalDomain的main方法时,需要传入生成的problem.txt与domain.txt, 进而生成两个 java 文件,一个为 domain.java 一个为 problem.java。 生成 problem.java 有一个方法,那个方法的返回值是我要的数据。 问题 1与2
shop.java 如何写参数才能让生成 problem.txt 与 domain.txt 放在 和shop.java 都在 scr的DP 目录下, DP是一个文件夹?除了硬编码的方式,还有别的吗? 问题 3:用什么方法,让通过 InternalDomain 这个类生成 problem.java 与 domain.txt 也在 scr 的目录下呢。除了硬编码的方式 和 修改 InternalDomain的代码,还有别的吗? 问题 4:对于生成 problem.java 应该如何动态的应用 其中的方法呢? 我要用的是 getPlans()。 以上问题,要一次通过调用 shop的构造完成,可行么?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedList;import JSHOP2.Axiom;
import JSHOP2.InternalAxiom;
import JSHOP2.JSHOP2;
import JSHOP2.JSHOP2GUI;
import JSHOP2.Operator;
import JSHOP2.Plan;
import JSHOP2.Predicate;
import JSHOP2.Term;
import JSHOP2.InternalDomain;/**
* @author n7063318
*
*/
public class shop {
private File fileDomain;
private File fileProblem;
public shop( ) throws IOException {
this.pathDomain = _pathDomain;
this.pathProblem = _pathProblem;
//---> 问题1
File dir = new File(/* 问题1 */); dir.mkdir();
//---> 问题2
fileDomain = new File( /* 问题 2 */ );
fileProblem = new File( /* 问题 2 */ );
fileDomain.createNewFile();
fileProblem.createNewFile();
//写文件,与本贴没有太大关系
FileOutputStream outDomain = new FileOutputStream( this.fileDomain );
outDomain.write("(defdomain basic (\r\n".getBytes());
outDomain.write("(:operator (!pickup ?a) () () ((have ?a)))\r\n".getBytes());
outDomain.write("(:operator (!drop ?a) ((have ?a)) ((have ?a)) ())\r\n".getBytes());
outDomain.write("(:method (swap ?x ?y)\r\n".getBytes());
outDomain.write("((have ?x) (not (have ?y)))\r\n".getBytes());
outDomain.write("((!drop ?x) (!pickup ?y))\r\n".getBytes());
outDomain.write("((have ?y) (not (have ?x)))\r\n".getBytes());
outDomain.write("((!drop ?y) (!pickup ?x)))))\r\n".getBytes());
outDomain.close();
FileOutputStream outProblem = new FileOutputStream( this.pathProblem );
outProblem.write("(defproblem problem basic\r\n".getBytes());
outProblem.write("((have kiwi)) ((swap banjo kiwi)))\r\n".getBytes());
outProblem.close();
// 写文件结束//----> 问题 3
/* 问题又来了,调用InternalDimain的main(),
* 在调用会生成一个 domain.java 和 problem.java 文件
*
*/
String domain[] = new String[1];
domain[0] = new String(this.pathDomain);
String problem[] = new String[2];
problem[0] = new String("-r");
problem[1] = new String(this.pathProblem);
try {
// 调用InternalDimain的main(), 在调用会生成一个 domain.java文件
InternalDomain.main(domain);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
// 调用InternalDimain的main(), 在调用会生成一个 problem.java文件
InternalDomain.main(problem);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//----> 问题 3 结束
//----> 问题 4 不知道在动态加载的时候,应该传进去什么东西,是一个 problem.java文件 还是 problem.class文件
// 在问题3中,只得到一个 problem.java,这个类中有一个方法,这个方法的返回值是我要的数据
// 但是,我只有 problem.java 文件 String classpath = "问题4"; //不知道这里写什么,是一个 *.java文件 还是 *.class
Class classproblem = null;
Method method = null;
LinkedList<Plan> plan = null;
try {
classproblem = Class.forName(classpath);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
method = classproblem.getMethod("genPlan", null);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
plan = (LinkedList<Plan>) method.invoke(classproblem.newInstance(), null);
} catch (IllegalArgumentException 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();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
shop ts = new shop( );
}
}
shop.java 如何写参数才能让生成 problem.txt 与 domain.txt 放在 和shop.java 都在 scr的DP 目录下, DP是一个文件夹?除了硬编码的方式,还有别的吗? 问题 3:用什么方法,让通过 InternalDomain 这个类生成 problem.java 与 domain.txt 也在 scr 的目录下呢。除了硬编码的方式 和 修改 InternalDomain的代码,还有别的吗? 问题 4:对于生成 problem.java 应该如何动态的应用 其中的方法呢? 我要用的是 getPlans()。 以上问题,要一次通过调用 shop的构造完成,可行么?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedList;import JSHOP2.Axiom;
import JSHOP2.InternalAxiom;
import JSHOP2.JSHOP2;
import JSHOP2.JSHOP2GUI;
import JSHOP2.Operator;
import JSHOP2.Plan;
import JSHOP2.Predicate;
import JSHOP2.Term;
import JSHOP2.InternalDomain;/**
* @author n7063318
*
*/
public class shop {
private File fileDomain;
private File fileProblem;
public shop( ) throws IOException {
this.pathDomain = _pathDomain;
this.pathProblem = _pathProblem;
//---> 问题1
File dir = new File(/* 问题1 */); dir.mkdir();
//---> 问题2
fileDomain = new File( /* 问题 2 */ );
fileProblem = new File( /* 问题 2 */ );
fileDomain.createNewFile();
fileProblem.createNewFile();
//写文件,与本贴没有太大关系
FileOutputStream outDomain = new FileOutputStream( this.fileDomain );
outDomain.write("(defdomain basic (\r\n".getBytes());
outDomain.write("(:operator (!pickup ?a) () () ((have ?a)))\r\n".getBytes());
outDomain.write("(:operator (!drop ?a) ((have ?a)) ((have ?a)) ())\r\n".getBytes());
outDomain.write("(:method (swap ?x ?y)\r\n".getBytes());
outDomain.write("((have ?x) (not (have ?y)))\r\n".getBytes());
outDomain.write("((!drop ?x) (!pickup ?y))\r\n".getBytes());
outDomain.write("((have ?y) (not (have ?x)))\r\n".getBytes());
outDomain.write("((!drop ?y) (!pickup ?x)))))\r\n".getBytes());
outDomain.close();
FileOutputStream outProblem = new FileOutputStream( this.pathProblem );
outProblem.write("(defproblem problem basic\r\n".getBytes());
outProblem.write("((have kiwi)) ((swap banjo kiwi)))\r\n".getBytes());
outProblem.close();
// 写文件结束//----> 问题 3
/* 问题又来了,调用InternalDimain的main(),
* 在调用会生成一个 domain.java 和 problem.java 文件
*
*/
String domain[] = new String[1];
domain[0] = new String(this.pathDomain);
String problem[] = new String[2];
problem[0] = new String("-r");
problem[1] = new String(this.pathProblem);
try {
// 调用InternalDimain的main(), 在调用会生成一个 domain.java文件
InternalDomain.main(domain);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
// 调用InternalDimain的main(), 在调用会生成一个 problem.java文件
InternalDomain.main(problem);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//----> 问题 3 结束
//----> 问题 4 不知道在动态加载的时候,应该传进去什么东西,是一个 problem.java文件 还是 problem.class文件
// 在问题3中,只得到一个 problem.java,这个类中有一个方法,这个方法的返回值是我要的数据
// 但是,我只有 problem.java 文件 String classpath = "问题4"; //不知道这里写什么,是一个 *.java文件 还是 *.class
Class classproblem = null;
Method method = null;
LinkedList<Plan> plan = null;
try {
classproblem = Class.forName(classpath);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
method = classproblem.getMethod("genPlan", null);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
plan = (LinkedList<Plan>) method.invoke(classproblem.newInstance(), null);
} catch (IllegalArgumentException 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();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
shop ts = new shop( );
}
}
如果是正式项目部署的时候应该不存在SRC这个目录下面也不应该有.java的文件吧
所有文件不是打成JAR包或者都编译成.class的文件
(个人观点)取的话应该只要取项目的classPath的路径应该就可以了吧
问题 4:对于生成 problem.java 应该如何动态的应用 其中的方法呢? 我要用的是 getPlans()。
要动态调用.java不清楚
只知道能动态调用.class文件
用的是ClassLoader这个用法网上找下应该满多的
你要获得他的路径既可以解决一二问题
2、一个类种植哪呢个有一个main()函数,你不能再
这句InternalDomain.main(problem);处调用
3、classForname的时候穿进去的是class,不是java文件,.java是源文件
如果在 C:\ 下面有一个 KK.class 的话,是不是应该如下使用呢?
后面的参数是什么呢 classForname("C:\\KK.class")
4楼的有理,在项目真正部署的时候是没有src文件夹和.java这样的文件的,估计楼主想要的是shop.class的文件路径,而非是shop.java的文件路径。可以参看ClassLoader
参看了,有个loadClass方法,比如,我把程序编译时生成的类放在了 C:\A 下面,我指定 Class clas = this.findClass(“C:\\A\aa.class”); // aa.class是我要加载的一个类
可是怎么也找不到呢?
提示为以下
at java.lang.ClassLoader.findClass(Unknown Source)
at Try.PlanLoader.loadClass(PlanLoader.java:30)
http://topic.csdn.net/u/20070713/00/d15ad117-daf3-4ef8-8e29-c4c6cbfb248f.html
改了,继承了一个 ClassLoader,你说的用URLClassLoader我觉得路径是个问题的,下面这个代码还是不对。public class PlanLoader extends ClassLoader { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PlanLoader pl = new PlanLoader();
Class c = pl.loadClass("C:\\Findme.class", true);
Findme f = new Findme();
}
public Class loadClass(String name, boolean resolve ) {
Class<Findme> clas = null;
try {
clas = (Class<Findme>) this.findClass(name);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return clas;
}}
在C盘的根目录下有个 abc.class要加在他,
程序这样写的 URL url = null;
try {
url = new URL("file:C/");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} URLClassLoader urlCL = new URLClassLoader(new URL[]{url});
Class clazz = null;
try {
clazz = urlCL.loadClass("abc"); //总是有错
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}错误就是这些
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source
可是没有加载成啊,怎么回事啊,再帮忙看看程序吧,是不是刚才加载的是 bin 下面的abc.class呢
//加载部分的关键代码,帮忙再看看了
URL url = null;
try {
url = new URL("file:C:/");
} catch (MalformedURLException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
} URLClassLoader urlCL = new URLClassLoader(new URL[]{url});
Class clazz = null;
try {
clazz = urlCL.loadClass("Try.Findme");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// abc.java部分的代码
package Try;public class Findme {
public void ok(){
System.out.print("you hava find me out");
}
public static void main(String[] args) {
}
}
Class[] parameterTypes = new Class[]{
java.lang.String.class,
java.lang.Boolean.class
};
Method mGetInstance = null;
String className = "myTestClass";
Class curTestClass = Class.forName(className);
try{
mGetInstance = curTestClass.
getMethod("getInstance",parameterTypes);
}
catch(NoSuchMethodException e){
e.printStackTrace();
mGetInstance = null;
}
if(mGetInstance != null){
myTestClass pObj = (myTestClass)
mGetInstance.invoke(
null,
new Object[]{
"src/myconfig.properties",
Boolean.FALSE
}
);
pObj.echoInfo();
}
else{
throw
new Exception("myTest Init Failed from class" +
className +
System.getProperty("line.seperator","\n") +
"method getInstance(String, Boolean) exists.");
}
}
}
public List getField(CodeTxtForm code,File ff) throws ClassNotFoundException
{
String name = code.getName();
URL url=null;
try {
url = ff.toURL();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URL urls[] = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class<?> obj = cl.loadClass(name);
Field[] field = obj.getDeclaredFields();
List<String> list = new ArrayList<String>();
for(Field f:field)
{
//System.out.println(f.getName());
list.add(f.getName());
}
return list;
}
这个是我的代码,File ff是你存放class文件的路径,String name是你的class文件的名字,注意没有后缀
在我这里是这样的
String path="E:\\myself\\webapps\\Test\\WEB-INF\\classes\\com\\lyb\\action";
File ff = new File(path);
Thread.currentThread().getContextClassLoader().getResource("");
得到当前的classpath的绝对路径的URI,然后再构造你的那些java,txt文江放在哪里。
,可是就是说没有啊,你提到了classpath的问题,是要在环境变量下设置么,那个我也设置了这个成功加载的情况,就是把 Findme.class 放在 A.class 存在的文件夹下,放在文件夹下,就是不给出url也能加载,但是我不能这么做的 URL url = null; File fff = new File("C:\\");
try {
url = fff.toURL();
} catch (MalformedURLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
URLClassLoader urlCL = new URLClassLoader(new URL[]{null});
Class<?> clazz = null;
try {
clazz = urlCL.loadClass("Findme");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ibm develop上有一个专门的类加载的教程,你去哪里看看吧,我现在都忘了
http://www.blogjava.net/Files/Unmi/Understand%20Java%20ClassLoader.rar 这是教程连接