自定义类加载器(ClassLoader + URLClassLoader)

【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);
   }
}    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值