站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题用自己写的类加载器加载类后的问题?

用自己写的类加载器加载类后的问题?

摘要: 用自己写的类加载器加载类后的问题?


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(-#34;defineClass:-#34;);
}

出错信息:java.lang.NoSuchMethodException:account.withdraw([I)
account是我装载的类,withdraw是这个类的方法.



代码谁能看懂?


我们可以交流,望高手相助



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


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


sos110(忙糊涂了) ( ) 信誉:100 Blog 2006-8-30 23:39:07 得分: 0


日,又一个机器人,还鄙视人!


望高手帮我解决问题呀!


如果不涉及秘密信息的话,可不可以把源代码完整的贴出来,比较好找原因。


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(-#34;can-#39;t read file-#34;);
fin.close();
return fileArray;
}

private boolean compileFile( String javaFile )throws IOException{
System.out.println(-#34;Compiling -#34;+javaFile);
Process p = Runtime.getRuntime().exec( -#34;javac -#34;+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(-#39;.-#39;,-#39;/-#39;);
String javaFileName = filedic+-#34;.java-#34;;
String classFileName = filedic+-#34;.class-#34;;
File javaFile = new File(javaFileName);
File classFile = new File(classFileName);
if( (javaFile.exists() -#38;-#38; !classFile.exists()) || (javaFile.lastModified() -#62; classFile.lastModified()))
{
try
{
if( !compileFile(javaFileName) || !classFile.exists())
{
throw new ClassNotFoundException(-#34;Compile failed:-#34;+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(-#34;defineClass:-#34;);
}

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

return objClass;

}
}
上面是自己的类装载器,下面的代码是我将类装载进来,并调用装载进来这个类的方法.

myClassLoader objClassLoader = new myClassLoader(); //建一个类装载器对象
Class clas = objClassLoader.loadClass( -#34;accounmeta-#34; ); //装载进accounmeta类
Class paraType[] = {(new int[0]).getClass()};
Method metaFunction = clas.getMethod(-#34;withdraw-#34;,paraType); //得到装载进accounmeta 中要调用的方法
Integer funargs = new Integer(10000);
Object arg[] = {funargs};
metaFunction.invoke(null,arg); //调用这个方法,参数是10000


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


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


第一个参数就是你的对象实例!


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


太谢谢你了,通过了.


↑返回目录
前一篇: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
后一篇: 关于线程的执行顺序问题