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是这个类的方法.
{
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是这个类的方法.
java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581(人员有限,不接收初学者,谅解)
java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581(人员有限,不接收初学者,谅解)
日,又一个机器人,还鄙视人!
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
将类装载进来之后,怎么创建它的实例呢?
Class obClas = clas.newInstance(); 好象不行.