Skip to content

Commit a011d91

Browse files
authored
KTLN-447: Getting a Kotlin KClass from a Package Class Name String (#933)
* unit tests changes * unit tests changes * unit tests changes * unit tests changes * unit tests changes * unit tests fixes * method code changes
1 parent 7d9aa80 commit a011d91

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

core-kotlin-modules/core-kotlin-advanced-3/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919
<artifactId>kotlinx-html-jvm</artifactId>
2020
<version>${kotlinx-html-jvm.version}</version>
2121
</dependency>
22+
23+
<dependency>
24+
<groupId>io.github.classgraph</groupId>
25+
<artifactId>classgraph</artifactId>
26+
<version>4.0.6</version>
27+
</dependency>
2228
</dependencies>
2329

2430
<properties>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.baeldung.obtainKclassFromPackageClassName
2+
3+
class ClassExample {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.baeldung.obtainKclassFromPackageClassName
2+
3+
import io.github.classgraph.ClassGraph
4+
import io.github.classgraph.ClassInfo
5+
import org.junit.jupiter.api.Test
6+
import org.junit.jupiter.api.assertThrows
7+
import kotlin.reflect.KClass
8+
import kotlin.test.assertEquals
9+
import kotlin.test.assertNull
10+
11+
class GetKclassUnitTest {
12+
13+
@Test
14+
fun `obtain the Kclass from Package Class name using forName method`() {
15+
val className = "com.baeldung.obtainKclassFromPackageClassName.ClassExample"
16+
17+
val kClass = getClassUsingForName(className)
18+
19+
assertEquals(ClassExample::class, kClass)
20+
}
21+
22+
@Test
23+
fun `obtain the Kclass from Package Class name using forName method and non-existing class`() {
24+
val notClass = "com.baeldung.obtainKclassFromPackageClassName.NotAClass"
25+
26+
val exception = assertThrows<ClassNotFoundException> {
27+
getClassUsingForName(notClass)
28+
}
29+
30+
assertEquals("com.baeldung.obtainKclassFromPackageClassName.NotAClass", exception.message)
31+
32+
}
33+
34+
@Test
35+
fun `obtain the Kclass from Package Class name using class loader`() {
36+
val className = "com.baeldung.obtainKclassFromPackageClassName.ClassExample"
37+
38+
val kClass = getClassFromLoader(className)
39+
40+
assertEquals(ClassExample::class, kClass)
41+
}
42+
43+
@Test
44+
fun `obtain the Kclass from Package Class name using class loader and non-existing class`() {
45+
val notClass = "com.baeldung.obtainKclassFromPackageClassName.NotAClass"
46+
47+
val exception = assertThrows<ClassNotFoundException> {
48+
getClassFromLoader(notClass)
49+
}
50+
51+
assertEquals("com.baeldung.obtainKclassFromPackageClassName.NotAClass", exception.message)
52+
}
53+
54+
@Test
55+
fun `obtain the Kclass from Package Class name using class path`() {
56+
val className = "com.baeldung.obtainKclassFromPackageClassName.ClassExample"
57+
val kClass = getClassUsingClassGraph(className)
58+
59+
assertEquals(ClassExample::class, kClass)
60+
}
61+
62+
@Test
63+
fun `obtain the Kclass from Package Class name using class path and non-existing class`() {
64+
val notClass = "com.baeldung.obtainKclassFromPackageClassName.NotAClass"
65+
66+
val kClass = getClassUsingClassGraph(notClass)
67+
assertNull(kClass)
68+
}
69+
}
70+
71+
fun getClassUsingForName(className: String): KClass<*>? {
72+
return Class.forName(className).kotlin
73+
}
74+
75+
fun getClassFromLoader(className: String): KClass<*>? {
76+
return ClassLoader.getSystemClassLoader().loadClass(className).kotlin
77+
}
78+
79+
fun getClassUsingClassGraph(className: String): KClass<*>? {
80+
val classInfo: ClassInfo? = ClassGraph()
81+
.addClassLoader(ClassLoader.getSystemClassLoader())
82+
.enableClassInfo()
83+
.scan()
84+
.getClassInfo(className)
85+
return classInfo?.loadClass()?.kotlin
86+
}

0 commit comments

Comments
 (0)