版权声明:本文为博主原创文章,未经博主允许不得转载。 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); -
} -
}