java - 将对象动态转换为特定类以使用函数

标签 java generics reflection

这是一段 java 代码,我们假设 org.abc.Test 是一个接口(interface)。

for (Object obj : objectArray[]) {
    if (obj instanceof org.abc.Test) {
        ((org.abc.Test)obj).someMethod();
    }
}

现在假设类org.abc.Test作为String动态传递,代码可能是这样的:

String className = "org.abc.Test";
Class<?> clazz = Class.forName(className);
for ( Object obj : objectArray[]) {
    if (clazz.inInstance(obj)) {
        obj = clazz.cast(obj);
        obj.someMethod();
    }
}

很遗憾,语句obj.someMethod(); 无法通过编译,因为编译器不知道转换后对象的具体类。

所以我认为应该使用这样的语句:

Class<? extends org.abc.Test> clazz;

有人可以帮忙解决这个问题吗?我只是 Java 反射机制的新手。


顺便说一句,我发现 obj = clazz.cast(obj); 不是正确的方法...

最佳答案

这是行不通的,因为 obj 对编译器来说仍然只是一个 Object,即使在 obj = clazz.cast(obj); 之后也是如此>。您需要像@Peggy 提到的那样进行显式转换:((org.abc.Test)obj).someMethod();

如果您想让它真正动态,您可以执行以下操作:

if (clazz.isInstance(obj)) {
    clazz.getMethod("someMethod").invoke(obj);
}

在这种情况下你甚至不需要强制转换。

关于java - 将对象动态转换为特定类以使用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31477061/

相关文章:

java - 需要对异常代码进行解释

java - 同一接口(interface)的Spring多重实现

ios - 无法使用类型为 'handler' 的参数列表调用 '([Post])'

java - Java泛型的类型参数中的问号是什么意思?

C++:有没有办法让这个反射宏与 IntelliSense 一起工作?

java - Solaris 但不是 Windows 中的 Oracle JDBC 连接异常?

java - 为什么我的 StringUtils 类没有 isBlank()

Java扩展了通用原型(prototype)

pointers - Golang 反射 : Can't set fields of interface wrapping a struct

调用 super init 的 python 装饰器