Skip to content

Commit 14e8455

Browse files
committed
Iterate through object components
1 parent 4f35012 commit 14e8455

File tree

5 files changed

+178
-5
lines changed

5 files changed

+178
-5
lines changed
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
1-
package com.baeldung.iterate.components;public class Circle {
1+
package com.baeldung.iterate.components;
2+
3+
public class Circle {
4+
public static final double PI = 3.14;
5+
6+
public static double calculateArea(double radius) {
7+
return PI * radius * radius;
8+
}
29
}
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
package com.baeldung.iterate.components
22

3-
class Employee {
3+
open class Employee() {
4+
var employeeId: Int = 0
5+
var salary: Double = 0.0
6+
7+
val currentSalary: Double
8+
get() = salary
9+
10+
val Employee.isSenior: Boolean
11+
get() = salary >= 1000.0
12+
13+
fun Employee.isPromoted(): Boolean {
14+
return salary >= 2000.0
15+
}
416
}
Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,33 @@
11
package com.baeldung.iterate.components
22

3-
class Person {
4-
}
3+
data class Person(val name: String, val age: Int) : Employee() {
4+
val isAdult: Boolean
5+
get() = age >= 18
6+
7+
val Person.isTeenager: Boolean
8+
get() = age in 13..19
9+
10+
fun Person.isRetired(): Boolean {
11+
return age >= 65
12+
}
13+
14+
companion object Create {
15+
fun create(name: String, age: Int) = Person(name, age)
16+
}
17+
18+
data class Job(val title: String, val salary: Float)
19+
20+
object Address {
21+
const val planet: String = "Earth"
22+
}
23+
}
24+
25+
fun Person.components(): Iterator<Pair<String, Any>> {
26+
return listOf(
27+
"name" to name,
28+
"age" to age,
29+
"isAdult" to isAdult,
30+
"isTeenager" to isTeenager,
31+
"isRetired" to isRetired()
32+
).iterator()
33+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
11
package com.baeldung.iterate.components
22

3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.junit.jupiter.api.Test
5+
36
class ReflectionInnerObjectsTests {
7+
@Test
8+
fun `Get inner data class for Person`() {
9+
val person = Person("Daniel", 37)
10+
11+
assertThat(person::class.nestedClasses)
12+
.extracting("simpleName")
13+
.contains("Job", "Address")
14+
}
15+
16+
@Test
17+
fun `Use iterator operator from Person`() {
18+
val person = Person("Daniel", 37)
19+
val properties = person.components().asSequence().toList()
20+
21+
assertThat(properties)
22+
.extracting("first")
23+
.containsOnly("name", "age", "isAdult", "isTeenager", "isRetired")
24+
}
425
}
Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,108 @@
11
package com.baeldung.iterate.components
22

3-
class ReflectionIteration {
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.junit.jupiter.api.Test
5+
import kotlin.reflect.full.*
6+
7+
class ReflectionIterationTests {
8+
@Test
9+
fun `Get data class members for Person`() {
10+
val person = Person("Daniel", 37)
11+
12+
person::class.members.forEach {
13+
println(it.name)
14+
}
15+
16+
assertThat(person::class.members)
17+
.extracting("name")
18+
.contains("age", "name", "isAdult", "currentSalary", "employeeId", "salary")
19+
20+
person::class.declaredMembers.forEach {
21+
println(it.name)
22+
}
23+
24+
assertThat(person::class.declaredMembers)
25+
.extracting("name")
26+
.contains("age", "isAdult", "name")
27+
}
28+
29+
@Test
30+
fun `Get data class member properties for Person`() {
31+
val person = Person("Daniel", 25)
32+
33+
assertThat(person::class.memberProperties)
34+
.extracting("name")
35+
.contains("age", "isAdult", "name", "employeeId", "salary")
36+
37+
assertThat(person::class.memberExtensionProperties)
38+
.extracting("name")
39+
.containsOnly("isTeenager", "isSenior")
40+
}
41+
42+
@Test
43+
fun `Get data class declared member properties for Person`() {
44+
val person = Person("Daniel", 37)
45+
46+
assertThat(person::class.declaredMemberProperties)
47+
.extracting("name")
48+
.containsOnly("age", "isAdult", "name")
49+
50+
assertThat(person::class.declaredMemberExtensionProperties)
51+
.extracting("name")
52+
.containsOnly("isTeenager")
53+
}
54+
55+
@Test
56+
fun `Get Java class static properties`() {
57+
val circle = Circle()
58+
59+
assertThat(Circle::class.staticProperties)
60+
.extracting("name")
61+
.containsOnly("PI")
62+
}
63+
64+
@Test
65+
fun `Get data class member functions for Person`() {
66+
val person = Person("Daniel", 37)
67+
68+
assertThat(person::class.memberFunctions)
69+
.extracting("name")
70+
.contains("component1", "component2", "copy", "equals", "hashCode", "toString")
71+
72+
assertThat(person::class.memberExtensionFunctions)
73+
.extracting("name")
74+
.containsOnly("isRetired", "isPromoted")
75+
}
76+
77+
@Test
78+
fun `Get data class declared member functions for Person`() {
79+
val person = Person("Daniel", 25)
80+
81+
assertThat(person::class.declaredMemberFunctions)
82+
.extracting("name")
83+
.contains("component1", "component2", "copy", "equals", "hashCode", "toString")
84+
85+
assertThat(person::class.declaredMemberExtensionFunctions)
86+
.extracting("name")
87+
.containsOnly("isRetired")
88+
}
89+
90+
@Test
91+
fun `Get data class static functions for Person`() {
92+
val circle = Circle()
93+
94+
assertThat(circle::class.staticFunctions)
95+
.extracting("name")
96+
.contains("calculateArea")
97+
}
98+
99+
@Test
100+
fun `Get data class companion object for Person`() {
101+
val person = Person("Daniel", 37)
102+
103+
assertThat(person::class.companionObject)
104+
.isNotNull
105+
.extracting("simpleName")
106+
.isEqualTo("Create")
107+
}
4108
}

0 commit comments

Comments
 (0)