我所需要做的事,关于反射,如果某个类A,是动态的进行编译的,我的意思是,在我的程序运行当中,其中一个线程对A.java其进行编译,生成一个 A.class 文件,我要加载这个 A.class,并调用其中的方法。过程我都知道,但是在做的时候,往往发生这样得情况,调用A.class的方法的话,会有异常,好像是 A.class,没有加载成功。我有一些预防的措施,比如,循环检测某个文件夹,观察其是否有 A.class 文件存在,有了再进行下面调用的步骤。这样虽然管点用,但是还是会有异常出现。大家能说说有什么好办法么?

解决方案 »

  1.   

    忘了,基本上程序跑了20次,会有一次出现,但是一般是这行出错,我在下面的程序里面也标出来了,帮忙看看,方法土不土,有没有什么好点的办法么。planlist = (LinkedList<Plan>) m.invoke(o, null); // 出错的
    try {
    clazz = urlCL.loadClass( agentName + "_p_" + taskName );
    } catch (ClassNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }

    go2 = true;
    while (go2) {

    if( clazz != null ){
    go2 = false;
    } // <!!NOTE!!>
    // have some time to generate files
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    clazz = urlCL.loadClass( agentName + "_p_" + taskName );
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }


    go2 = true;
    while (go2) {

    if( o != null ){
    go2 = false;
    } // <!!NOTE!!>
    // have some time to generate files
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } try {
    o = clazz.newInstance();
    } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } }

     LinkedList<Plan> planlist = null;
     try {
    m = clazz.getMethod("getPlans",null);
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    while (go2) {

    if( m != null ){
    go2 = false;
    } // <!!NOTE!!>
    // have some time to generate files
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    m = clazz.getMethod("getPlans",null);
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }


    try {
                                    // 这一行出错哦~~~~
    planlist = (LinkedList<Plan>) m.invoke(o, 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();
    }

      

  2.   

    晕死,楼主能介绍一下你为什么要进行动态编译吗我感觉如果程序运行时生成java源程序的话,就应该可以静态地写到程序中
      

  3.   


    因为我用了别的 API,那个API就是动态生成的