[ClassLoader] load byte array and use as jar
I found/create a program for loading jar files from an URL to the systemclassloader, then the object is always usable.
Now I want to load the jar file into a byte array and use that byte array as jar.
Current code, load directly from URL:
Code:
import java.awt.GridLayout;
import java.awt.Panel;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class loader extends java.applet.Applet
{
private static final long serialVersionUID = 1L;
private static final Class<?>[] parameters = new Class[]{URL.class};
public void init()
{
setLayout(new GridLayout());
try {
addURL(new URL("http://localhost/theLibrary.jar"));
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
final c c = new c("test", "panel");
if(c.getTheClass() instanceof Panel)
add((Panel)c.getTheClass());
c.callMethod("setText", "hey");
} catch (Exception e) {
System.out.println("error: " + e.getMessage());
}
}
private void addURL(URL u) throws IOException
{
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<?> sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[]{ u });
}catch(Throwable t){
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
}
}
class c
{
private Object to;
private Class<?> clazz;
public c(String className, Object... args) throws Exception
{
clazz = ClassLoader.getSystemClassLoader().loadClass(className);
Constructor<?> cs = clazz.getConstructor(getClassesFromObjects(args));
to = cs.newInstance(args);
}
public void callMethod(String methodName, Object... args) throws Exception
{
Method m = clazz.getMethod(methodName, getClassesFromObjects(args));
m.invoke(to, args);
}
private Class<?>[] getClassesFromObjects(Object... args)
{
Class<?>[] o = new Class<?>[0];
for(int i=0; i<args.length; i++)
{
Class<?>[] o2 = new Class<?>[o.length+1];
for(int j=0; j<o.length; j++)
o2[j]=o[j];
o2[i]=args[i].getClass();
o=o2;
}
return o;
}
public Object getTheClass()
{
return to;
}
}
Now I want to do:
Code:
try {
URL u = new URL("http://localhost/theLibrary.jar")
int contentLength = u.openConnection().getContentLength();
InputStream openStream = u.openStream();
byte[] binaryData = new byte[contentLength];
openStream.read(binaryData);
openStream.close();
addJarToSystemClassLoader(binaryData); // unknow function
} catch (IOException e) {
e.printStackTrace();
}
I've allready searched at the internet for this, but I didn't found the right thing.
Does someone know how I can do that?
Thanks in advance,
Dennis