java动态加载,java文件生成,建立文件路径等

Eniak 2010-01-30 08:34:22
问个问题啊,这个东西是在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( );
}
}
...全文
971 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
poFate 2010-02-02
  • 打赏
  • 举报
回复
恩 确实,按理说这个URLloader可以加载网络上的类文件,他应该是把类文件传到和加载类的同一个文件夹下的
ibm develop上有一个专门的类加载的教程,你去哪里看看吧,我现在都忘了
http://www.blogjava.net/Files/Unmi/Understand%20Java%20ClassLoader.rar 这是教程连接
Eniak 2010-02-02
  • 打赏
  • 举报
回复
仔细对比了一下,发现代码没有很大的差异啊,看看我写的,文件发在C:\下面,也就是C:\Findme.class
,可是就是说没有啊,你提到了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();
}

[Quote=引用 26 楼 pofate 的回复:]
Java codepublic 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);
[/Quote]

wswzwz 2010-02-02
  • 打赏
  • 举报
回复
路径写死了,每次换程序不是要重新编译,不是很麻烦嘛
poFate 2010-02-02
  • 打赏
  • 举报
回复
路径写死了,人是活的 。路径的来源是不同的 不就是一个字符串吗
wswzwz 2010-02-02
  • 打赏
  • 举报
回复
你的路径都写死了嘛,写死了不要移植的啊。
Thread.currentThread().getContextClassLoader().getResource("");
得到当前的classpath的绝对路径的URI,然后再构造你的那些java,txt文江放在哪里。

poFate 2010-02-02
  • 打赏
  • 举报
回复

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);
Eniak 2010-02-02
  • 打赏
  • 举报
回复
系统类没问题,但是就是指定目录后,找不到。
tan124 2010-02-01
  • 打赏
  • 举报
回复
publicstaticvoid main(String[] args) throws Exception{
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.");
}
}
}
lucom11 2010-02-01
  • 打赏
  • 举报
回复
.java在运行时是不能被加载的,除非,你生成的是.class文件.不过,好像一般人没这个水平!
Eniak 2010-02-01
  • 打赏
  • 举报
回复
好像又不对了,刚才发下自己的 bin 下面有个 abc.class ,我把它删除了以后,想加载C:\abc.class
可是没有加载成啊,怎么回事啊,再帮忙看看程序吧,是不是刚才加载的是 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) {

}

}

Eniak 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pofate 的回复:]
引用 9 楼 eniak 的回复:
引用 8 楼 pofate 的回复:
1、File dir = new File(".");//代表当前文件夹
你要获得他的路径既可以解决一二问题
2、一个类种植哪呢个有一个main()函数,你不能再
这句InternalDomain.main(problem);处调用
3、classForname的时候穿进去的是class,不是java文件,.java是源文件


如果在 C:\ 下面有一个 KK.class 的话,是不是应该如下使用呢?
后面的参数是什么呢 classForname("C:\\KK.class")

以前做过这个,但是不是用classForname,用这个可能会找不到class文件(用的不熟,也不知道原因),建议用URLClassLoader,这个无论文件在哪里,只要路径正确就可以加载进来
[/Quote]

改了,继承了一个 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;
}

}

config_man 2010-01-31
  • 打赏
  • 举报
回复
头晕,帮顶!
poFate 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eniak 的回复:]
引用 8 楼 pofate 的回复:
1、File dir = new File(".");//代表当前文件夹
你要获得他的路径既可以解决一二问题
2、一个类种植哪呢个有一个main()函数,你不能再
这句InternalDomain.main(problem);处调用
3、classForname的时候穿进去的是class,不是java文件,.java是源文件


如果在 C:\ 下面有一个 KK.class 的话,是不是应该如下使用呢?
后面的参数是什么呢 classForname("C:\\KK.class")
[/Quote]
以前做过这个,但是不是用classForname,用这个可能会找不到class文件(用的不熟,也不知道原因),建议用URLClassLoader,这个无论文件在哪里,只要路径正确就可以加载进来
Eniak 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liuwenjie517333813 的回复:]
引用 4 楼 eniak 的回复:
能写一下么,确实不会,跪求了


4楼的有理,在项目真正部署的时候是没有src文件夹和.java这样的文件的,估计楼主想要的是shop.class的文件路径,而非是shop.java的文件路径。可以参看ClassLoader
[/Quote]

参看了,有个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)
poFate 2010-01-31
  • 打赏
  • 举报
回复
前些天也写这个类似的程序,最后用url解决的
Eniak 2010-01-31
  • 打赏
  • 举报
回复
谢谢PoFate程序加载的部分已经基本上出来了, abc.class在编译的时候有个包,我在输入的时候,没有把包给出,后面的事情都比较顺利。稍后送分
Eniak 2010-01-31
  • 打赏
  • 举报
回复
上面的有个地方写错了

应该是

url = new URL("file:C:/");

但是改正后,还是不行
Eniak 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 pofate 的回复:]
URL的什么路径问题?
[/Quote]

在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
poFate 2010-01-31
  • 打赏
  • 举报
回复
URL的什么路径问题?
加载更多回复(10)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧