# \[reflection\] How to get companion object and new instance from ::class via reflection?

**URL:** <https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273>\
**Category:** Uncategorized\
**Created:** [April 27, 2015, 9:10am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273 "2015-04-27T09:10:35Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![Unitcraft](https://avatars.discourse-cdn.com/v4/letter/u/2acd7d/32.png) [@Unitcraft](https://discuss.kotlinlang.org/u/Unitcraft)\
**Post date:** [April 27, 2015, 9:10am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/1 "2015-04-27T09:10:35Z")

</div>

&nbsp;

```kotlin
class A{
  companion object{
  fun fn(){
          println(“A”)
  }
  }
}
class B{
  companion object{
  fun fn(){
          println(“B”)
  }
  }
}
fun invokeFnInCompanion(cl : KClass<*>){
  //???
}
fun invokeCtor<T>(cl : KClass<T>):T{
  //???
}
invokeFnInCompanion(A::class) // must print A
invokeFnInCompanion(B::class) // must print B
invokeCtor(A::class) // must return new instance A
invokeCtor(B::class) // must return new instance B
```

How to write body of **invokeFnInCompanion**?  
How to write body of **invokeCtor**?

---

<div class="post-metadata">

**Author:** ![udalov](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/udalov/32/5679_2.png) [@udalov](https://discuss.kotlinlang.org/u/udalov)\
**Post date:** [April 27, 2015, 1:03pm UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/2 "2015-04-27T13:03:38Z")

</div>

Companion object is a named object whose name is `Companion`. So, this will get a class reference to the companion object: `A.Companion::class`. In the same fashion, to get a function reference to `fn` you can write `A.Companion::fn`. New instance construction is not yet supported in Kotlin reflection.

---

<div class="post-metadata">

**Author:** ![TSL](https://avatars.discourse-cdn.com/v4/letter/t/e480ec/32.png) [@TSL](https://discuss.kotlinlang.org/u/TSL)\
**Post date:** [July 18, 2024, 10:47am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/3 "2024-07-18T10:47:52Z")

</div>

can anyone please let me know any updates on this issue ?

I tried with companionObjectInstance

getCompanionObjectFromReflexiveApi() {

val companionObjectJavaClass = Utils.Companion::class.java

```
    val companionObjectInstance = companionObjectJavaClass.kotlin
        .companionObjectInstance!!
    val result: Boolean = companionObjectInstance::class.java
        .methods
        .first { it.name == "comapanionObjectMethod" }
        .invoke(companionObjectInstance, context, "hello") as Boolean

   val companionClass = Class.forName("com.xyz.common.Utils\${Companion}")
    val checkReflexiveMethod: Method = companionClass.getDeclaredMethod(
        "comapanionObjectMethod", Context::class.java,
        String::class.java
    )

```

}

getting error as java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/reflect/full/KClasses;

in gradle used the plugin implementation “org.jetbrains.kotlin:kotlin-reflect:$1.6.21”

---

<div class="post-metadata">

**Author:** ![madmax1028](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/madmax1028/32/3335_2.png) [@madmax1028](https://discuss.kotlinlang.org/u/madmax1028)\
**Post date:** [July 18, 2024, 6:52pm UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/4 "2024-07-18T18:52:26Z")

</div>

> [@Unitcraft](#):
>
> ```auto
> class A{
> companion object{
> fun fn(){
> println(“A”)
> }
> }
> }
> class B{
> companion object{
> fun fn(){
> println(“B”)
> }
> }
> }
> fun invokeFnInCompanion(cl : KClass<*>){
> //???
> }
> fun invokeCtor<T>(cl : KClass<T>):T{
> //???
> }
> invokeFnInCompanion(A::class) // must print A
> invokeFnInCompanion(B::class) // must print B
> invokeCtor(A::class) // must return new instance A
> invokeCtor(B::class) // must return new instance B
> 
> ```

The most naive version could look like this:

```kotlin
fun invokeFnInCompanion(cls: KClass<*>) {
	cls.companionObject!!.functions.first { it.name == "fn" }.call(cls.companionObjectInstance)
}

fun <T : Any> invokeCtor(cls: KClass<T>): T {
	return cls.primaryConstructor!!.call()
}

```

---

<div class="post-metadata">

**Author:** ![TSL](https://avatars.discourse-cdn.com/v4/letter/t/e480ec/32.png) [@TSL](https://discuss.kotlinlang.org/u/TSL)\
**Post date:** [July 22, 2024, 9:04am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/5 "2024-07-22T09:04:23Z")

</div>

Thank you for your reply @ [madmax1028](https://discuss.kotlinlang.org/u/madmax1028)

I have used your code in my test cases

still I’m getting the below error

Caused by: java.lang.ClassNotFoundException: Didn’t find class “kotlin.reflect.full.KClasses” on path: DexPathList[[zip file “/system/framework/android.test.runner.jar”, zip file “/system/framework/android.test.mock.jar”, zip file “/system/framework/android.test.base.jar”, zip file

---

<div class="post-metadata">

**Author:** ![madmax1028](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/madmax1028/32/3335_2.png) [@madmax1028](https://discuss.kotlinlang.org/u/madmax1028)\
**Post date:** [July 22, 2024, 9:29am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/6 "2024-07-22T09:29:50Z")

</div>

It looks like **kotlin-reflect** library is not available. Indicates some problem with your gradle configuration most likely.

---

<div class="post-metadata">

**Author:** ![TSL](https://avatars.discourse-cdn.com/v4/letter/t/e480ec/32.png) [@TSL](https://discuss.kotlinlang.org/u/TSL)\
**Post date:** [July 22, 2024, 9:32am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/7 "2024-07-22T09:32:11Z")

</div>

I have used this plugin in build.gradle

implementation “org.jetbrains.kotlin:kotlin-reflect:$1.6.21”

---

<div class="post-metadata">

**Author:** ![madmax1028](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/madmax1028/32/3335_2.png) [@madmax1028](https://discuss.kotlinlang.org/u/madmax1028)\
**Post date:** [July 22, 2024, 9:41am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/8 "2024-07-22T09:41:45Z")

</div>

Why did you put a `$` sign in the first place? When I tried it locally a dependency simply dissapeared from my classpath. Try to remove it for starters:

```auto
implementation "org.jetbrains.kotlin:kotlin-reflect:1.6.21"

```

---

<div class="post-metadata">

**Author:** ![TSL](https://avatars.discourse-cdn.com/v4/letter/t/e480ec/32.png) [@TSL](https://discuss.kotlinlang.org/u/TSL)\
**Post date:** [July 22, 2024, 9:58am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/9 "2024-07-22T09:58:15Z")

</div>

please excuse that, its typo mistake I have kept kotlin\_version variable at project level build.gradle file

and I configured in app’s build.gradle like  
implementation “org.jetbrains.kotlin:kotlin-reflect:$kotlin\_version”

---

<div class="post-metadata">

**Author:** ![TSL](https://avatars.discourse-cdn.com/v4/letter/t/e480ec/32.png) [@TSL](https://discuss.kotlinlang.org/u/TSL)\
**Post date:** [July 23, 2024, 10:50am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/10 "2024-07-23T10:50:51Z")

</div>

can you please help me

---

<div class="post-metadata">

**Author:** ![madmax1028](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/madmax1028/32/3335_2.png) [@madmax1028](https://discuss.kotlinlang.org/u/madmax1028)\
**Post date:** [July 24, 2024, 1:07pm UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/11 "2024-07-24T13:07:05Z")

</div>

From your previous posts I guess that we are talking about an Android application here. Unfortunatelly it’s not my area of expertise 🙂

---

<div class="post-metadata">

**Author:** ![Skater901](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/skater901/32/10163_2.png) [@Skater901](https://discuss.kotlinlang.org/u/Skater901)\
**Post date:** [July 26, 2024, 4:58am UTC](https://discuss.kotlinlang.org/t/reflection-how-to-get-companion-object-and-new-instance-from-class-via-reflection/273/12 "2024-07-26T04:58:07Z")

</div>

Use `./gradlew dependencies` to get a dependency tree, and see if the Kotlin reflect library is in your dependencies.
