0

我有一些分析数据的代码,并且我意识到我想要一些针对非常特定的数据源而不是通用处理的代码。任何单独的来源都可能随时间而变化,并且已经有几个不同的来源需要考虑。为了处理这种情况,我从 Java 启动了完整的独立程序,这很好,但是有一些问题,我决定改用动态类加载。我从 v 1.1 开始一直在使用 Java,并且通常熟悉大多数 Java 问题,但是这个特定任务让我想知道我是否使用了错误版本的 Java或类似的版本,因为我得到的错误看起来像方法调用我我的版本不知道我正在尝试。我刚在想也许我遗漏了一个重要的进口声明?

我发现了几个很好的例子,其中最好的似乎是这个,因为它完全符合我的意愿:http://media.techtarget.com/tss/static/articles/content/dm_classForname/DynLoad.pdf

代码的第一个示例正是我想做的那种事情,所以,我从中提取了一些内容 - 与我自己做的事情(我一直在努力)没有太大不同,但它不会t 编译 - 各种“找不到符号”错误。由于我的代码更加庞大,我自己尝试了它们,它也不会编译,和我的一样!这是该代码:

public class DynamicLoader
{
   public static void main(String[] args) throws Exception
   {
      Class toRun = Class.forName(args[0]);
      Method mainMethod = findMain(toRun);
      mainMethod.invoke(null, new Object[] { args });
   }
   private static Method findMain(Class clazz) throws Exception
   {
      Method[] methods = clazz.getMethods();
      for (int i=0; i<methods.length; i++)
      {
         if (methods[i].getName().equals("main"))
         return methods[i];
      }
      return null;
   }
}

当我尝试编译它时,我得到:

# javac DynamicLoader.java
DynamicLoader.java:11: error: cannot find symbol
   private static Method findMain(Class clazz) throws Exception
                  ^
  symbol:   class Method
  location: class DynamicLoader
DynamicLoader.java:8: error: cannot find symbol
      Method mainMethod = findMain(toRun);
      ^
  symbol:   class Method
  location: class DynamicLoader
DynamicLoader.java:13: error: cannot find symbol
      Method[] methods = clazz.getMethods();
      ^
  symbol:   class Method
  location: class DynamicLoader
3 errors

我的java版本:javac 1.7.0_45

我想问题很简单/基本,但是查看文档没有任何线索!

4

1 回答 1

0

嗯,坚持!

我很确定这是某种进口问题,确实如此!

关键是要认识到 Method 类是 java.lang.reflect 的一部分。然而,仅仅导入 java.lang.reflect 并没有这样做。这是做了什么:

import java.lang.reflect.Method;

我在这里找到了有用的信息:http: //www.programcreek.com/2013/09/java-reflection-tutorial/

我很惊讶这在在线文档中并没有更明显,但是,嗯,这一定是我在某种程度上的疏忽......这个特别难以确定的一个原因是因为“方法”在数十万篇关于 Java 的文章中都可以找到,并且很难让网络搜索专注于完全正确的事情。这是一个挑战的另一个原因是因为有许多使用此代码的示例不包含所需的导入行。

于 2015-05-09T03:08:47.393 回答