2015-02-07 119 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