2014-05-19 70 views
0

我試圖調用該方法listFilesAndDirs()。但它返回NoSuchMethodException。自定義類加載器在listFilesAndDirs返回NoSuchMethodException()使用自己的自定義類加載器org.apache.commons.io.FileUtils的方法調用

用於方法調用的代碼。用於類加載器cls.getDeclaredMethods的

public class MyLoader extends ClassLoader { 
private String classPath; 
public MyLoader() 
{ 

} 
private String jarFile = "D:/Project/lib/commons-io-2.4.jar";;   //Path to the jar file 
private Hashtable classes = new Hashtable(); //used to cache already defined classes 

public Class loadClass(String className) throws ClassNotFoundException { 

return findClass(className); 
} 

public Class findClass(String className) { 
//System.out.println(className+" is loaded by Custom class Loader"); 


byte classByte[]; 
Class result = null; 

result = (Class) classes.get(className); //checks in cached classes 
if (result != null) { 
    return result; 
} 



try { 
    JarFile jar = new JarFile(jarFile); 
    classPath=className.replaceAll("\\.", "/"); 
    JarEntry entry = jar.getJarEntry(classPath + ".class"); 
    if(entry==null) 
    { 
     return findSystemClass(className); 
    } 
    else 
    { 

    InputStream is = jar.getInputStream(entry); 
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
    int nextValue = is.read(); 
    while (-1 != nextValue) { 
     byteStream.write(nextValue); 
     nextValue = is.read(); 
    } 

    classByte = byteStream.toByteArray(); 
    result = defineClass(className, classByte, 0, classByte.length, null); 
    classes.put(className, result); 
    return result; 
    } 
} catch (Exception e) { 
    return null; 
} 


} 
} 

()調用將返回方法 org.apache.commons.io.FileUtils.listFilesAndDirs(java的

MyLoader c=new MyLoader(); 
Class cls=c.loadClass("org.apache.commons.io.FileUtils"); 
//to display the available methods 
Method m[] = cls.getDeclaredMethods(); 
for (int i = 0; i < m.length; i++) 
    System.out.println(m[i].toString()); 

// to get a listFilesAndDirs method 
Method me=cls.getMethod("listFilesAndDirs",new Class[] { File.class, IOFileFilter.class, 
      IOFileFilter.class }); 

代碼。 io.File,org.apache.commons.io.filefilter.IOFileFilter,org.apache.commons.io.filefilter.IOFileFilter)

但cl s.getMethod( 「listFilesAndDirs」,新的等級[] {File.class,IOFileFilter.class, IOFileFilter.class}); 返回以下錯誤

java.lang.NoSuchMethodException:org.apache.commons.io.FileUtils.listFilesAndDirs(java.io.File的,org.apache.commons.io.filefilter.IOFileFilter,org.apache。 commons.io.filefilter.IOFileFilter) 在java.lang.Class.getDeclaredMethod(Class.java:1937) 在Sample.main(Sample.java:30)

回答

1

所以,getDeclaredMethods()顯示有問題的類有所需方法listFilesAndDirs(java.io.File,org.apache.commons.io.filefilter.IOFileFilter,org.apache.commons.io.filefilter.IOFileFilter),

但是

的參數類型是從你進入cls.getMethod("listFilesAndDirs",new Class[]{...})什麼,即使它似乎他們引用適當的類別不同。

編譯的代碼使用上下文類加載器中的org.apache.commons.io.filefilter.IOFileFilter類,而cls需要自定義類加載器中的相同類。

使其工作的一種方法是從自定義類加載器中加載IOFileFilter,然後在調用getMethod時將該類用作第二個和第三個項目。

Class ioFileFilterClass = c.loadClass("org.apache.commons.io.filefilter.IOFileFilter"); 
Method me = cls.getMethod("listFilesAndDirs", new Class[] { File.class, ioFileFilterClass, ioFileFilterClass}); 

它會解決這個特定的問題,但你必須每次都試圖通過自定義類加載器加載接入類和方法的時間寫類似的代碼。

相關問題