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