public Class loadClass( String name,boolean resolve )
{
    Class objClass = null;
    objClass = findLoadedClass(name);
try{
   byte raw[] = getBytes( classFileName );
   objClass = defineClass( name,raw,0,raw.length );
}catch( IOException ie )
{
   System.out.println("defineClass:");
}出错信息:java.lang.NoSuchMethodException:account.withdraw([I)
account是我装载的类,withdraw是这个类的方法.

解决方案 »

  1.   

    ========================================================================
    java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581(人员有限,不接收初学者,谅解)
      

  2.   

    ========================================================================
    java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581(人员有限,不接收初学者,谅解)
      

  3.   

    sos110(忙糊涂了) ( ) 信誉:100    Blog  2006-8-30 23:39:07  得分: 0  
     日,又一个机器人,还鄙视人!
      

  4.   

    import java.io.*;
    import java.lang.reflect.*;public class myClassLoader extends ClassLoader{

    private byte[] getBytes( String fileName )throws IOException{
    File file = new File( fileName );
    long fileLen = file.length();
    byte fileArray[] = new byte[(int)fileLen];
    FileInputStream fin = new FileInputStream(file);
    int r = fin.read(fileArray);
    if( r != fileLen )
    throw new IOException("can't read file");
    fin.close();
    return fileArray;
    }

    private boolean compileFile( String javaFile )throws IOException{
    System.out.println("Compiling "+javaFile);
    Process p = Runtime.getRuntime().exec( "javac "+javaFile );
    try
    {
    p.waitFor();
    }catch( InterruptedException ie )
    {
    System.out.println(ie);
    }
    int ret = p.exitValue();
    return ret == 0;
    }

    public Class loadClass( String name,boolean resolve )throws ClassNotFoundException{
    Class objClass = null;
    objClass = findLoadedClass(name);

    //byte raw[] = new byte[1000];
    String filedic = name.replace('.','/');
    String javaFileName = filedic+".java";
    String classFileName = filedic+".class";
    File javaFile = new File(javaFileName);
    File classFile = new File(classFileName);
    if( (javaFile.exists() && !classFile.exists()) || (javaFile.lastModified() > classFile.lastModified()))
    {
    try
    {
    if( !compileFile(javaFileName) || !classFile.exists())
    {
    throw new ClassNotFoundException("Compile failed:"+javaFileName);
    }
    }catch( IOException ie )
    {
    throw new ClassNotFoundException(ie.toString());
    }
    }

    //确保已经正确编译或者不需要编译,我们开始加载原始字节
    try
    {
    byte raw[] = getBytes( classFileName );
    objClass = defineClass( name,raw,0,raw.length );
    }catch( IOException ie )
    {
    System.out.println("defineClass:");
    }

    if( objClass == null )
    {
    objClass = findSystemClass(name);
    }
    if( resolve && objClass != null )
    resolveClass(objClass);
    if( objClass == null )
    throw new ClassNotFoundException( name );

    return objClass;

    }
    }
    上面是自己的类装载器,下面的代码是我将类装载进来,并调用装载进来这个类的方法.myClassLoader objClassLoader = new myClassLoader();  //建一个类装载器对象
    Class clas = objClassLoader.loadClass( "accounmeta" ); //装载进accounmeta类
    Class paraType[] = {(new int[0]).getClass()};
    Method metaFunction = clas.getMethod("withdraw",paraType); //得到装载进accounmeta   中要调用的方法
    Integer funargs = new Integer(10000);
    Object arg[] = {funargs};
    metaFunction.invoke(null,arg);  //调用这个方法,参数是10000
      

  5.   

    你的accounmeta中的withdraw方法如果参数是int型的,请使用Class paraType[] = {Integer.TYPE},{(new int[0]).getClass()};应该是int[]类型参数;其次,调用时,如果第一个参数为null,请使用static定义你的withdraw方法。
      

  6.   

    如果我的withdraw方法不是static的,第一个参数应该是什么呢?  谢谢
      

  7.   

    Class clas = objClassLoader.loadClass( "accounmeta" ); 
    将类装载进来之后,怎么创建它的实例呢?
    Class obClas = clas.newInstance(); 好象不行.