Kotlin:kotlinClass.class.getName()无法返回包名,只能返回简单的类名。

34
如果AClass是一个Java类,这个方法将会返回包名和类名。但是,当我将AClass Java文件转换成Kotlin文件时,它只会返回类名。因此系统无法找到这个类路径。
上面的代码:AClass.class.getName();

我不是Kotlin的专业人士,但你可以尝试使用“AClass.class.getPackage().getName();”并将其附加到“AClass.class.getName();”中。就像这样:“String location = AClass.class.getPackage().getName() + "." + AClass.class.getName();”。 - CJ Burkey
谢谢,Class.forName(fragmentName)如果fragmentName是一个Kotlin类,它会抛出ClassNotFoundException。无论fragmentName是完整的名称还是不完整的名称,我都感到困惑。 - 叶钦富
那个修复了吗? - CJ Burkey
val c = Class.forName(fragmentName)?.newInstance() fragment=c as Fragment中的fragmentName是一个完整的KClass名称,它解决了我的问题。 - 叶钦富
5个回答

54

在 Kotlin 中,有多种方法可以获取 Java Class 的完全限定名:

通过 KClass.qualifiedName 属性获取名称:

val name = AClass::class.qualifiedName;

或者通过属性Class.name获取名称:

val name = AClass::class.java.name;

或者通过Class#getName方法获取名称:

val name = AClass::class.java.getName();

以下是一个类的限定名称的表:

|-----------------------|-----------------------|-----------------------|
|                       |          Class        |     Anonymous Class   |
|-----------------------|-----------------------|-----------------------|
| KClass.qualifiedName  |    foo.bar.AClass     |         null          |
|-----------------------|-----------------------|-----------------------|
| Class.name            |    foo.bar.AClass     |    foo.bar.AClass$1   |
|-----------------------|-----------------------|-----------------------|
| Class.getName()       |    foo.bar.AClass     |    foo.bar.AClass$1   |
|-----------------------|-----------------------|-----------------------|

如果您添加了每个描述选项的示例输入样本和输出,则会非常棒。 - Eugen Pechanec
1
@EugenPechanec先生,感谢您的反馈。现在怎么样了? - holi-java
谢谢,实际上这就是我想要的内容。 - 叶钦富
我认为第二种和第三种技术是完全相同的,因为Kotlin将以“.get”开头的Java方法公开为属性:https://kotlinlang.org/docs/java-interop.html#getters-and-setters - Will Chen

10
如果是Java代码片段:
var fragmentSimpleName = FragmentName::class.java.simpleName as String

谢谢。我理解的是,Kotlin 片段也是一样的。 - CoolMind

9

请尝试以下解决方案:-

var name = MainActivity::class.java.canonicalName as String

实际上,只有几行代码需要转换成 Kotlin。在 Java 类中调用了 AClass.class.getName(); 这段代码,因此我不能使用你提供的 Kotlin 语法。 - 叶钦富
实际上,只有几行代码需要转换成 Kotlin。在 Java 类中调用了 AClass.class.getName(); 这段代码,因此我不能使用你提供的 Kotlin 语法。我需要一个完整的文件名,因为下一步将会调用 Class.forName(fragmentName)。fragmentName 应该被 AClass 的完整名称所替代。但是现在 AClass 是一个 Kotlin 类,它会抛出 ClassNotFoundException 异常。 - 叶钦富

6
这是我用来获取类名的方法。
    val TAG = javaClass.simpleName

对于Android开发者来说,将日志声明为一个字段并调用打印非常有用。


javaClass是什么? - CoolMind
1
javaClass 是您键入的类。只需在任何类中键入 javaClass,它就可以工作。 - Kashif Anwaar
谢谢!它不应该在companion object中被用作常量,而应该像变量一样使用。在companion object中,我们可以使用val TAG = YourClass::class.java.simpleName - CoolMind
@CoolMind,那是一个冗长的解决方案,你必须在使用它的每个地方都输入你的类名。而我的代码行可以复制到任何类中,并且可以在不进行任何修改的情况下使用。 - Kashif Anwaar

1
也许我来晚了,但是我使用新实例的哈希码来完成。它是一个整数,因此允许进行各种测试。
 private val areaFragment by lazy { Area_Fragment.newInstance() }

    var fragmentHashCode = fragment.hashCode()
            when (fragmentHashCode) {
                areaFragment.hashCode() -> {
                    myNavigationView.setCheckedItem(R.id.nav_area)
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接