3

I've got sample third party Java code:

public class ApiClass extends PackagePrivateClass {
}

abstract class PackagePrivateClass {
    public static class StaticClass {
    }
}

So only ApiClass and StaticClass are public. In Java I can get reference to StaticClass with: ApiClass.StaticClass. For the same code in Kotlin I got Unresolved reference: StaticClass. I can't also get reference via PackagePrivateClass, because it's package private (captain obvious). Is there any hack to get reference to StaticClass (it's third party code so I can't simply make PackagePrivateClass public)?

I understand that it's probably 'by design', however it forbids me from using 3p code

ysakhno
  • 834
  • 1
  • 7
  • 17
ZZ 5
  • 1,744
  • 26
  • 41
  • Have you tried kotlin reflection, https://kotlinlang.org/docs/tutorials/kotlin-for-py/member-references-and-reflection.html – DemoDemo Mar 02 '20 at 16:07

1 Answers1

1

It seems the only solution is to build Java wrapper class that your kotlin class can access to.

public class ApiClass extends PackagePrivateClass {

}

abstract class PackagePrivateClass {

    public static class StaticClass {

        void instanceFunction() {

        }

        static void classFunction() {
        }
    }
}

The adapter java class (StaticClassAdapter.java):

class StaticClassAdapter {

    private static ApiClass.StaticClass staticClass;

    void instanceFunction() {
        staticClass.instanceFunction();
    }

    static void classFunction() {
        PackagePrivateClass.StaticClass.classFunction();
    }
}

So in your kotlin code...

class KotlinClass {

    fun main() {
        StaticClassAdapter().instanceFunction()
        StaticClassAdapter.classFunction()
    }
}
glagarto
  • 913
  • 8
  • 20