【0】README
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PacosonSWJTU/article/details/51076989
【0】README
0.1)本文主要对类加载器进行分析,且 URLClassLoader是 ClassLoader的子类;
0.2)关于如何设置类加载器的加载路径,参见 对servlet容器的补充
【1】URLClassLoader类加载器
1.1)URLClassLoader的一种加载方式
-
package com.tomcat.classloader;
-
import java.io.File;
-
import java.lang.reflect.Constructor;
-
import java.lang.reflect.Method;
-
import java.net.URL;
-
import java.net.URLClassLoader;
-
public class URLClassLoaderTest {
-
public final static String dir = System.getProperty("user.dir") + File.separator + "src" + File.separator;
-
public static void main(String[] args) throws Exception {
-
// Getting the jar URL which contains target class
-
URL[] classLoaderUrls = new URL[]{new URL("file:" + dir)};
-
// Create a new URLClassLoader
-
URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);
-
// Load the target class
-
Class<?> beanClass = urlClassLoader.loadClass("com.tomcat.test.Bean");
-
// Create a new instance from the loaded class
-
Constructor<?> constructor = beanClass.getConstructor();
-
Object beanObj = constructor.newInstance();
-
// Getting a method from the loaded class and invoke it
-
Method method = beanClass.getMethod("sayHello");
-
method.invoke(beanObj);
-
}
-
}
-
package com.tomcat.test;
-
public class Bean {
-
public void sayHello() {
-
System.out.println("Hello from loaded Bean class for test!!!");
-
}
-
}
1.2)URLClassLoader的另一种加载方式
-
package com.tomcat.classloader;
-
import java.io.File;
-
import java.lang.reflect.Constructor;
-
import java.lang.reflect.Method;
-
import java.net.MalformedURLException;
-
import java.net.URL;
-
import java.net.URLClassLoader;
-
public class URLClassLoaderTest {
-
public final static String dir = System.getProperty("user.dir") +
-
File.separator + "webroot" + File.separator;
-
public static void main(String[] args) {
-
try {
-
File file = new File(dir);
-
URL url = file.toURI().toURL(); // attend this line
-
URL[] urls = new URL[]{url};
-
URLClassLoader loader = new URLClassLoader(urls, null, null);
-
System.out.println("test = " + loader.getURLs()[0].toString());
-
Class<?> beanClass = loader.loadClass("servlet.Bean");
-
Object obj = beanClass.newInstance();
-
Method method = beanClass.getMethod("sayHello");
-
method.invoke(obj);
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
}
【2】ClassLoader类加载器的加载方式
-
package com.tomcat.test;
-
import java.lang.reflect.Constructor;
-
import java.lang.reflect.Method;
-
public class ClassLoaderTest {
-
// 第一种加载类的方式
-
public static void main1(String[] args) throws Exception {
-
Class<?> newClass = Class.forName("com.tomcat.classloader.Bean");
-
Constructor constructor = newClass.getConstructor();
-
Object obj = constructor.newInstance();
-
Method method = newClass.getMethod("sayHello");
-
method.invoke(obj);
-
}
-
// 第二种加载类的方式
-
public static void main(String[] args) throws Exception {
-
ClassLoader loader = Thread.currentThread().getContextClassLoader();
-
Class<?> newClass = loader.loadClass("com.tomcat.classloader.Bean");
-
Constructor constructor = newClass.getConstructor();
-
Object obj = constructor.newInstance();
-
Method method = newClass.getMethod("sayHello");
-
method.invoke(obj);
-
}
-
}