TestApiClassLoaderManager.java 4.06 KB
package com.zhaoonline.support.gateway.apijar;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.junit.Assert;
import org.junit.Test;

import com.zhaoonline.support.gateway.utils.Utils;

import javassist.CannotCompileException;
import javassist.NotFoundException;

public class TestApiClassLoaderManager {
	public static String classParentDir = "D://test/";
	String jarDir=classParentDir + "testJar.jar"; 
	
	
	@Test
	public void testAddNewLoader() throws IOException, NotFoundException, CannotCompileException, ClassLoaderExistException{
		ApiClassLoaderManager manager=ApiClassLoaderManager.INSTANCE;
		
		Utils.deleteDirectory(Paths.get(classParentDir));
		Set<PosixFilePermission> perms=new HashSet<PosixFilePermission>();
		perms.add(PosixFilePermission.GROUP_EXECUTE);
		perms.add(PosixFilePermission.GROUP_READ);
		perms.add(PosixFilePermission.GROUP_WRITE);
		Files.createDirectories(Paths.get(classParentDir));
		
		Map<String, Class<?>> properties = new HashMap<String, Class<?>>();
		properties.put("name", java.lang.String.class);
		properties.put("id", java.lang.String.class);
		
		TestJarLoader.createDynamicJarWithSimplePojo(properties, "com.test.User",  jarDir);
		
		URLClassLoader newLoader=JarLoader.loadFromJar(Thread.currentThread().getContextClassLoader(), jarDir);
		manager.add("com.test.User",newLoader);
		
		
		int count=manager.getApiClassLoaderCount();
		
		Assert.assertEquals(1, count);
		String className="com.test.User";
		
		Class<?> targetClass;
		try {
			targetClass = manager.loadClass(className);
			Assert.assertNotNull(targetClass);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (MultiClassFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Class<?> targetClass2=null;
		String className2="com.test.User2";
		
		try {
			targetClass2 = manager.loadClass(className2);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			Assert.assertNull(targetClass2);
		} catch (MultiClassFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void testUnloadLoader() throws IOException, NotFoundException, CannotCompileException, ClassNotFoundException{
		Utils.deleteDirectory(Paths.get(classParentDir));
		Set<PosixFilePermission> perms=new HashSet<PosixFilePermission>();
		perms.add(PosixFilePermission.GROUP_EXECUTE);
		perms.add(PosixFilePermission.GROUP_READ);
		perms.add(PosixFilePermission.GROUP_WRITE);
		Files.createDirectories(Paths.get(classParentDir));
		
		Map<String, Class<?>> properties = new HashMap<String, Class<?>>();
		properties.put("name", java.lang.String.class);
		properties.put("id", java.lang.String.class);
		
		TestJarLoader.createDynamicJarWithSimplePojo(properties, "com.test.User",  jarDir);
		
		
		WeakReference<URLClassLoader> weakReference=new WeakReference<URLClassLoader>(JarLoader.loadFromJar(Thread.currentThread().getContextClassLoader(), jarDir));
		
		URLClassLoader newLoader=weakReference.get();
				
		Assert.assertNotNull(newLoader);
		
		Class<?> userClass = newLoader.loadClass("com.test.User");
		Assert.assertNotNull(userClass);
		newLoader.close();
		
		newLoader=null;
		Assert.assertNotNull(weakReference.get());
		System.gc();
		
		Class<?> userClassAfterClose = weakReference.get().loadClass("com.test.User");
		
		Assert.assertNotNull(weakReference.get());
		
		Assert.assertNotNull(userClassAfterClose);
		
//		Class<?> userClass = newLoader.loadClass("com.test.User");
//		Assert.assertNotNull(userClass);
//		newLoader.close();
//		
//		Utils.deleteDirectory(Paths.get(classParentDir));
//		
//		Class<?> userClassAfterUnLoad = newLoader.loadClass("com.test.User");
//		
//		Assert.assertNotNull(userClassAfterUnLoad);
		
//		Class<?> userClassAfterUnLoad2 = newLoader.loadClass("com.test.User");
//		
//		Assert.assertNotNull(userClassAfterUnLoad2);
		
		
	}
	
	
	
}