我正在学习Java中的反思。我开始知道我们可以使用反射轻松提取类文件中使用的方法。
我有一个java类文件,它有很多方法。
测试文件是指我想要读取所用方法的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 :(得分:0)
除非您在Classpath上编译了类,否则您的程序将无法运行。
Class.forName(String)
的参数期望类路径上的类的完全限定名称,而不是文件路径。
答案 1 :(得分:0)
Class classname = Class.forName(actfilename);
这里' actfilename'应该是完全限定的类名。
例如:
必填的班级名称 - com.organisation.reflection.Testfile
您的班级名称 - Testfile
当您调用Class.forName(" sampleClass")时,JVM会在运行时动态加载该类,并返回与" sampleClass"相关联的Class对象。
例如:
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类。
答案 2 :(得分:0)
Hurrayy ......终于明白了...... :) :):D:D 非常感谢ppl ... :):)
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);
}
}