/*
* @(#)ClassLoaderTest.java 1.10 06/10/10
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*
*/
import sun.misc.*;
import java.lang.reflect.*;
import java.net.*;
import java.io.*;
import sun.misc.GC;
public class ClassLoaderTest {
/*
* The stream handler factory for loading system protocol handlers.
* NOTE: This is a clone of the Factor class in Launch.java.
*/
private static class Factory implements URLStreamHandlerFactory {
private static String PREFIX = "sun.net.www.protocol";
public URLStreamHandler createURLStreamHandler(String protocol) {
String name = PREFIX + "." + protocol + ".Handler";
try {
Class c = Class.forName(name);
return (URLStreamHandler)c.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
throw new InternalError("could not load " + protocol +
"system protocol handler");
}
}
public static void main(String argv[]) {
/* Make sure that calling ClassLoader.getResourceAsStream doesn't
* result in opening jarfiles that never close.
*/
sun.misc.CVM.setURLConnectionDefaultUseCaches(false);
/*
* Setup the urls[] array for the URLClassLoader. This is basically
* copying what is done in Launcher.java, although we take
* some liberties like assuming that java.class.path only
* contains one item.
*/
final String s = System.getProperty("java.class.path");
System.out.println("java.class.path: " + s);
URL[] urls = new URL[1];
URLStreamHandlerFactory factory = new Factory();
URLStreamHandler fileHandler = factory.createURLStreamHandler("file");
try {
urls[0] = new URL("file", "", -1, s, fileHandler);
} catch (MalformedURLException e) {
// Should never happen since we specify the protocol...
throw new InternalError();
}
int i;
for (i = 0; i < Integer.parseInt(argv[0]); i++) {
try {
/* Get a URLClassLoader. It will load classes
* off of the java.class.path.
*/
URLClassLoader cl = new URLClassLoader(urls, null);
/* Load the class whose name was passed in. */
Class clazz = cl.loadClass(argv[1]);
/* Call the main() method of the class. */
Class[] argTypes = new Class[1];
argTypes[0] = Class.forName("[Ljava.lang.String;");
Method main = clazz.getMethod("main", argTypes);
Object[] args = new Object[1];
String[] arg0 = new String[argv.length - 2];
args[0] = arg0;
for (int j = 0; j < argv.length - 2; j++) {
arg0[j] = argv[j+2];
}
main.invoke(null, args);
/* Verify that jarfiles opened by getResourceAsStream
also get closed.
*/
InputStream stream = cl.getResourceAsStream("Test.class");
System.out.println("InputStream: " + stream);
/* Null out any references we have to the Test class and
* the application ClassLoader.
*/
cl = null;
clazz = null;
main = null;
stream = null;
/* Run the gc. If you set a breakpoint in CVMclassFree(), it
* should get hit for Test and any other application class
* loaded by Test.
*/
System.out.println("Running GC #1");
java.lang.Runtime.getRuntime().gc();
System.out.println("Running Finalizers #1");
java.lang.Runtime.getRuntime().runFinalization();
System.out.println("Running GC #2");
java.lang.Runtime.getRuntime().gc();
System.out.println("Running Finalizers #2");
java.lang.Runtime.getRuntime().runFinalization();
System.out.println("Done");
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}