【问题标题】:Java calling method from generic class泛型类的Java调用方法
【发布时间】:2015-08-03 05:36:15
【问题描述】:

这样的事情可能吗?

List<?> myList = getMyList();
class cls = class.forname("com.lab.myClass");
cls = myList.get(0);
cls.getValue();

使用类的完全限定名称创建一个实例并使用它们声明的方法?

【问题讨论】:

  • 你在寻找类似this的东西吗?
  • 如果您有完全限定名称,您就知道它是什么类型。如果你知道它是什么类型,直接使用就行了。
  • 你有看过一些关于java反射的教程吗?你应该这样做,它会在未来(和现在)让你免于沮丧。

标签: java list generics methods reflection


【解决方案1】:

不,如果您调用Class.forName,在编译时您对返回的Class 实例一无所知。你甚至不知道它代表一个类;例如,它可能是一个接口。特别是,如果它是一个类并且你创建了它的一个实例,你不能调用它的任何方法,除了那些已经在Object 中定义的方法,因为在编译时,编译器无法检查这些方法是否存在。

有两种解决方案:

首先,您可以使用反射来了解类具有的方法,并调用这些方法。这很麻烦。

其次,如果您使用Class.forName 在运行时动态加载类,通常您对所加载的类有所了解。例如,您可能知道该类实现了某个接口。然后你可以将newInstance的结果强制转换到这个接口,然后直接调用这个接口中定义的方法。

例如:

// in file Plugin.java
interface Plugin {
    void doSomething();
}

// in file Main.java
public class Main { 
    ...
    void runPlugin() {
        try {
            Class<?> pluginClass = Class.forName("pkg.name.MyPlugin");
            Plugin plugin = (Plugin) pluginClass.newInstance();
            plugin.doSomething();
        }
        catch (...) {
            // catch the necessary exceptions
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多