添加 ClassLoaderUtil

This commit is contained in:
tursom 2019-12-14 00:25:31 +08:00
parent fa4202e2d1
commit 9f1b852976
3 changed files with 41 additions and 1 deletions

View File

@ -0,0 +1,6 @@
package cn.tursom.log
import org.slf4j.Logger
import org.slf4j.LoggerFactory
inline fun <reified T> LoggerFactory.getLogger(): Logger = LoggerFactory.getLogger(T::class.java)

View File

@ -6,6 +6,10 @@ import java.net.URLClassLoader
import java.util.ArrayList
import java.util.jar.JarFile
@Suppress("UNCHECKED_CAST")
val ClassLoader.classes: List<Class<*>>
get() = ClassLoaderUtil.classes.get(this) as List<Class<*>>
fun ClassLoader.getClassByPackage(
packageName: String,
childPackage: Boolean = true
@ -17,6 +21,8 @@ inline fun <reified T> T.getClassByPackage(
): List<String> = ClassLoaderUtil.getClassByPackage(packageName, childPackage, T::class.java.classLoader)
object ClassLoaderUtil {
internal val classes = ClassLoader::class.java.getDeclaredField("classes").also { it.isAccessible = true }
/**
* 获取某包下所有类
* @param packageName 包名
@ -129,7 +135,7 @@ object ClassLoaderUtil {
if (urlPath.endsWith("classes/")) {
continue
}
val jarPath = "$urlPath!/$packagePath"
val jarPath = "$urlPath/$packagePath"
myClassName.addAll(getClassNameByJar(jarPath, childPackage))
}
return myClassName

View File

@ -0,0 +1,28 @@
package cn.tursom.core
import java.net.URL
import java.net.URLClassLoader
@Suppress("unused")
class ListClassLoader(url: Array<out URL>, parent: ClassLoader? = null) : URLClassLoader(url, parent) {
private val parentList = ArrayList<ClassLoader>()
val parents: List<ClassLoader> get() = parentList
fun addParent(parent: ClassLoader) = parentList.add(parent)
fun removeParent(parent: ClassLoader) = parentList.remove(parent)
override fun findClass(name: String?): Class<*> {
try {
return super.findClass(name)
} catch (e: ClassNotFoundException) {
}
parentList.forEach {
try {
return it.loadClass(name)
} catch (e: ClassNotFoundException) {
}
}
throw ClassNotFoundException(name)
}
}