【问题标题】:Cast a class that is dynamically obtained强制转换动态获取的类
【发布时间】:2016-04-14 18:55:57
【问题描述】:

我正在尝试强制转换一个我动态获取的已实现接口的类。我已经尝试了以下方法,但它似乎不起作用。我是如何做到这一点的。

public InterfaceX test(){

 InterfaceX x = null;
 Class<?> classX = Class.forName("com.TestClassX");
 x = (InterfaceX) classX;
 return  x;

}

编辑: 我不想创建实例,因为我只是想简单地调用接口定义的静态方法。

【问题讨论】:

  • 你为什么要这样做?你只会回来null
  • 您是否尝试创建和转换该类的对象?就其本身而言,类不是类以外的任何事物的实例。
  • 您将Class 类型的值转换为InterfaceX。这永远不会奏效。 Classfinal 并且没有实现 InterfaceX
  • 如果静态方法是在已知接口中定义的,直接调用即可。没有理由去做你正在尝试的事情。
  • x 是一个InterfaceXInterfaceX 是否定义 someStaticMethod()?然后就做InterfaceX.someStaticMethod()。多态性不适用于static 方法。

标签: java generics casting classloader


【解决方案1】:

如果xClass 对象,则不能使用x.staticMethod()。但是,这可以通过反射来实现。

public interface Interface {
    static void method() {
        System.out.println("Hello, World!");
    }
}

然后,在主类中你可以这样做。

import java.lang.reflect.*;

public class Main  {

    public static void invokeMethod(String className)  {
        try {
            Class<?> clazz = Class.forName(className);
            Method method = clazz.getDeclaredMethod("method");
            method.invoke(null);   // null is used for static methods. For instance methods, pass the instance.
        } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        invokeMethod("Interface");
    }
}

这可行,但您通常应尽量避免使用反射(java.lang.reflect 中的任何内容)。大多数情况下,您尝试解决的问题都有更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多