2015-02-07 121 views
0

我正在學習Java中的反思。我開始知道我們可以使用反射輕鬆地提取類文件中使用的方法。類未找到異常

我有一個java類文件,它有n個方法。

測試文件指的是java類從那裏我想讀使用的方法和testSample是從哪兒我訪問TESTFILE類方法

public class testSample 
    { 

     public static void main(String args[]) throws ClassNotFoundException 

     { 

      File filename = new File(
        "C:/ProgramData/Eclipse/Projects_3.7.1/Testfile.java"); 

      String filen = filename.toString(); 

      if (filen.endsWith(".java")) 

      { 

       String actfilename = StringUtils.substringBefore(filen, ".java"); 

       Class classname = Class.forName(actfilename); 

       Method[] method = classname.getMethods(); 

       for (Method methods : method) 

       { 

        System.out.println("Method name \r\n" + methods.getName()); 

        Class[] parameters = methods.getParameterTypes(); 

        for (Class parametername : parameters) 

        { 

         System.out.println("parameters name \r\n" 
           + parametername.getName()); 

        } 

       } 

      } 

     } 
    } 

請大家幫我出這個我的課。

我越來越

異常錯誤如下

Exception in thread "main" java.lang.ClassNotFoundException: testFile 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at com.TestSample1.retrievemethods(TestSample1.java:58) 
    at com.TestSample1.filetraverse(TestSample1.java:43) 
    at com.TestSample1.filetraverse(TestSample1.java:45) 
    at com.TestSample1.main(TestSample1.java:22) 

TESTFILE

非常感謝您的寶貴建議。但我仍然沒有擺脫它。

讓我說清楚。

static File appname="C:/programdata/eclipse/appname"; 

public static void main(String[] args) throws ClassNotFoundException 

{ 

     TestSample1 tf1=new TestSample1(); 

     tf1.filetraverse(appname); 

} 

public void filetraverse(File appname) throws ClassNotFoundException 

{ 

     if (appname.isDirectory()) 

     { 

      File[] files = appname.listFiles(); 

      for (File filename : files) 

      { 

        String finame=filename.getName().toLowerCase(); 

        if(finame.endsWith("java")) 

        { 

          retrievemethods(filename,reflection); 

        }   

          filetraverse(filename);  

      }   

     } 

    } 

public void retrievemethods(File filename,File reflection) throws 
ClassNotFoundException 

    { 

     String classna=filename.toString(); 

     String classnam=StringUtils.substringBetween(classna, "/appname/", ".java"); 

     Class reflectclass = Class.forName(classnam); 

     Method[] method=reflectclass.getMethods(); 

     for (Method methods : method) 

     { 

      System.out.println("Method name \r\n"+methods.getName()); 

     Class[] parameters=methods.getParameterTypes(); 

     for (Class parametername : parameters) 

     { 

      System.out.println("parameters name \r\n"+parametername.getName()); 

     } 

    } 

    } 

和我得到的錯誤是類未找到異常。

+0

是什麼內容' actfilename' – Jens 2015-02-07 10:49:46

+0

「我開始知道我們可以很容易地提取類文件中使用的方法」'foo.java'不是類文件,'foo.class'是。此外,您還需要具有要在classpath中使用的類的包的位置,或者使用ClassLoader加載它。 – Pshemo 2015-02-07 10:51:36

回答

0

除非您在Classpath上編譯了類,否則您的程序將無法工作。

另外Class.forName(String)的參數是期望在類路徑上完全合格的類的名稱,而不是文件路徑

+0

我的包中有兩個類文件。一個是測試文件,另一個測試樣本, Class classname = TestSample2.class; 如果TestSample2在同一個包中,這將適用於這種情況。 博特如何獲取類名,如果它在不同的包。 我們如何通過文件整個路徑來獲得相應的類名? 「C:/ProgramData/Eclipse/Projects_3.7.1/TestSample2.java」 – 2015-02-07 10:58:40

+0

請描述您的目錄結構。 – Crazyjavahacking 2015-02-07 11:01:10

0
Class classname = Class.forName(actfilename); 

這裏'actfilename'應該是完全限定的類名。

如: 所需的類名稱 - com.organisation.reflection.Testfile 你的類名 - Testfile

當你做出的Class.forName(「sampleClass」)的調用,JVM動態加載的類在運行時,返回相關的類對象與「sampleClass」。

對於例如:

package com.organisation.reflection; 

class TestFile { 

static { 

    System.out.println("TestFile class loaded."); 
} 

}

package com.organisation.reflection; 

public class TestSample { 

public static void main(String[] args) { 
    try { 
     Class c = Class.forName("com.organisation.reflection.TestFile"); 
    } catch (ClassNotFoundException e) { 
    } 

} 

}

輸出:

TESTFILE類加載。

Check Class.forName here

+0

我得到的異常錯誤如下 – 2015-02-07 11:05:33

+0

在eclipse中工作時,我們在哪裏可以找到.java的.class文件? – 2015-02-07 11:10:51

+0

問題是,它對單個類而言工作正常。如果我在一個文件夾中有n個類文件,無法全部讀取它們 – 2015-02-07 11:15:56

0

Hurrayy ......終於得到它.. :) :):d:d 多謝脂肪酶... :) :)

public void retrievemethods(File filename,File reflection) throws ClassNotFoundException 
    { 
     Class c=filename.getClass(); 
     Method[] method=c.getMethods(); 
     for (Method methods : method) 
     { 
      System.out.println("new methods"+methods); 
     } 
    } 
+0

但是沒用的.. :( 猜猜輸出是什麼.. :( 它只是顯示文件操作方法,如 getabsolutepath,獲得canonicalpath等... :(:( – 2015-02-07 15:53:55