问个问题啊,这个东西是在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( );
}
}

解决方案 »

  1.   

    其中感觉有点问题:
    如果是正式项目部署的时候应该不存在SRC这个目录下面也不应该有.java的文件吧
    所有文件不是打成JAR包或者都编译成.class的文件
    (个人观点)取的话应该只要取项目的classPath的路径应该就可以了吧
    问题 4:对于生成 problem.java 应该如何动态的应用 其中的方法呢? 我要用的是 getPlans()。 
    要动态调用.java不清楚
    只知道能动态调用.class文件
    用的是ClassLoader这个用法网上找下应该满多的
      

  2.   

    1、File dir = new File(".");//代表当前文件夹
    你要获得他的路径既可以解决一二问题
    2、一个类种植哪呢个有一个main()函数,你不能再
    这句InternalDomain.main(problem);处调用
    3、classForname的时候穿进去的是class,不是java文件,.java是源文件
      

  3.   


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

  4.   


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

  5.   


    参看了,有个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)
      

  6.   

    楼主可以参考http://www.cnblogs.com/chinatefl/archive/2008/05/30/1210753.html
    http://topic.csdn.net/u/20070713/00/d15ad117-daf3-4ef8-8e29-c4c6cbfb248f.html
      

  7.   

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

  8.   


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

  9.   


    在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
      

  10.   

    上面的有个地方写错了应该是url = new URL("file:C:/");但是改正后,还是不行
      

  11.   

    谢谢PoFate程序加载的部分已经基本上出来了, abc.class在编译的时候有个包,我在输入的时候,没有把包给出,后面的事情都比较顺利。稍后送分
      

  12.   

    前些天也写这个类似的程序,最后用url解决的 
      

  13.   

    好像又不对了,刚才发下自己的 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) {

    }

      

  14.   

    .java在运行时是不能被加载的,除非,你生成的是.class文件.不过,好像一般人没这个水平!
      

  15.   

     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.");
             }
         }
    }
      

  16.   


    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);
      

  17.   

    你的路径都写死了嘛,写死了不要移植的啊。
    Thread.currentThread().getContextClassLoader().getResource("");
    得到当前的classpath的绝对路径的URI,然后再构造你的那些java,txt文江放在哪里。
      

  18.   

    仔细对比了一下,发现代码没有很大的差异啊,看看我写的,文件发在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();
    }
      

  19.   

    恩  确实,按理说这个URLloader可以加载网络上的类文件,他应该是把类文件传到和加载类的同一个文件夹下的
    ibm develop上有一个专门的类加载的教程,你去哪里看看吧,我现在都忘了
    http://www.blogjava.net/Files/Unmi/Understand%20Java%20ClassLoader.rar 这是教程连接