我有一个简单的函数来加载类" Myclass"来自所选目录。
// Variables
File temp = new File("some path...");
String class_name = "MyClass";
// Directory url
URL[] urls = null;
try {
urls = new URL[]{temp.toURI().toURL()};
} catch (MalformedURLException e) {
e.printStackTrace();
}
// Loading the class
ClassLoader cl = new URLClassLoader(urls);
Class clazz = null;
Object clazz_instance = null;
try {
// Loads class
clazz = cl.loadClass(class_name);
// Creates instance
clazz_instance = clazz.newInstance();
// Invoking method "myMethod"
try {
Method m = clazz.getMethod("myMethod");
m.invoke(clazz_instance);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | NullPointerException e) {
e.printStackTrace();
}
} catch (NoClassDefFoundError | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
我们假设我有以下课程:
public class MyClass {
public void myMethod() {
MyOtherClass moc = new MyOtherClass();
// ...... some code
}
}
class MyOtherClass {}
但是当我想调用方法" myMethod"我得到了:
java.lang.reflect.InvocationTargetException
Caused by: java.lang.IllegalAccessError: tried to access class "MyOtherClass" from class "MyClass"
我觉得问题来自于" MyOtherClass"不公开(它不可能,因为它与#34; MyClass"在同一个文件中。)。
我该如何解决这个问题?
答案 0 :(得分:1)
这是因为您没有首先从代码加载依赖项类。将MyOtherClass放在自己的文件中并将其设置为public。然后按如下所示加载它。
cl.loadClass("MyOtherClass");
cl.loadClass(class_name);
如果你坚持让两个类都在同一个文件中。将其定义如下
public class MyClass {
class MyOtherClass {}
public void myMethod() {
MyOtherClass moc = new MyOtherClass();
}
}