Use ClassLoader fot this kind of situations Detailedtutorial can be found, for example, here: https://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html
Your further search tags are: java, class loader,dynamic runtime class load
Here is an example.
How you prepare class for loading:
public class MyClassLoader extends ClassLoader{
publicMyClassLoader(ClassLoader parent) {
super(parent);
}
public ClassloadClass(String name) throws ClassNotFoundException {
if(!"reflection.MyObject".equals(name))
return super.loadClass(name);
try {
Stringurl = "file:C:/data/projects/tutorials/web/WEB-INF/" +
"classes/reflection/MyObject.class";
URL myUrl = new URL(url);
URLConnection connection = myUrl.openConnection();
InputStream input = connection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
intdata = input.read();
while(data != -1){
buffer.write(data);
data = input.read();
}
input.close();
byte[]classData = buffer.toByteArray();
returndefineClass("reflection.MyObject",
classData, 0, classData.length);
} catch(MalformedURLException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
returnnull;
}
}
And how you load it:
public static void main(String[] args) throws
ClassNotFoundException,
IllegalAccessException,
InstantiationException {
ClassLoaderparentClassLoader = MyClassLoader.class.getClassLoader();
MyClassLoaderclassLoader = new MyClassLoader(parentClassLoader);
ClassmyObjectClass = classLoader.loadClass("reflection.MyObject");
AnInterface2 object1 =
(AnInterface2) myObjectClass.newInstance();
MyObjectSuperClassobject2 =
(MyObjectSuperClass) myObjectClass.newInstance();
//create newclass loader so classes can be reloaded.
classLoader =new MyClassLoader(parentClassLoader);
myObjectClass= classLoader.loadClass("reflection.MyObject");
object1 =(AnInterface2)
myObjectClass.newInstance();
object2 =(MyObjectSuperClass) myObjectClass.newInstance();
}
Comments
Leave a comment