给你改了一下,jdk不推荐覆盖loadclass方法,推荐使用findclass。 这三个java文件都放在 myclassLoader目录下面。 package myclassLoader;import java.io.*;public class MyLoader extends ClassLoader{
public byte[] getBytes(File classfile){ byte[] raw = new byte[(int)classfile.length()]; try{ FileInputStream in = new FileInputStream(classfile); int len = in.read(raw); if(len!=classfile.length()){ System.err.println("wrong what"); } }catch(Exception e){ System.out.println(e); } return raw; } /*
//Subclasses of ClassLoader are encouraged to override findClass(String), rather than this method.
public Class loadClass(String name, boolean resolve){ Class type = null; File classfile = new File("./Person.class"); byte[] raw = getBytes(classfile); System.out.println("name "+name); try{ type = defineClass(name,raw,0,raw.length);//在这行报错!!!!!!!!!! }catch(Exception e){ System.out.println("OK"); } if((resolve == true)&&(type !=null)){ resolveClass(type); } return type; }*/ public Class findClass(String name){ Class type = null; File classfile = new File("./Person.class"); byte[] raw = getBytes(classfile); return defineClass(name,raw,0,raw.length); } } package myclassLoader; import java.lang.reflect.*; import myclassLoader.MyLoader; public class Core { public static void main(String[] args)throws Exception{ MyLoader loader = new MyLoader(); Class type = loader.loadClass("myclassLoader.Person"); try{ Person one = (Person)type.newInstance(); one.say(); }catch(Exception e){ } } } package myclassLoader; public class Person { private String name; private int age; public Person(){ name = "Jack"; } public void say(){ System.out.println(name); }
public static void main(String[] args){ Person p = new Person(); p.say(); } }
貌似是Person.java的位置不对,不应该放在myclassLoader包下面
这三个java文件都放在 myclassLoader目录下面。
package myclassLoader;import java.io.*;public class MyLoader extends ClassLoader{
public byte[] getBytes(File classfile){
byte[] raw = new byte[(int)classfile.length()];
try{
FileInputStream in = new FileInputStream(classfile);
int len = in.read(raw);
if(len!=classfile.length()){
System.err.println("wrong what");
}
}catch(Exception e){
System.out.println(e);
}
return raw;
}
/*
//Subclasses of ClassLoader are encouraged to override findClass(String), rather than this method.
public Class loadClass(String name, boolean resolve){
Class type = null;
File classfile = new File("./Person.class");
byte[] raw = getBytes(classfile);
System.out.println("name "+name);
try{
type = defineClass(name,raw,0,raw.length);//在这行报错!!!!!!!!!!
}catch(Exception e){
System.out.println("OK");
}
if((resolve == true)&&(type !=null)){
resolveClass(type);
}
return type;
}*/
public Class findClass(String name){
Class type = null;
File classfile = new File("./Person.class");
byte[] raw = getBytes(classfile);
return defineClass(name,raw,0,raw.length);
}
}
package myclassLoader;
import java.lang.reflect.*;
import myclassLoader.MyLoader;
public class Core {
public static void main(String[] args)throws Exception{
MyLoader loader = new MyLoader();
Class type = loader.loadClass("myclassLoader.Person");
try{
Person one = (Person)type.newInstance();
one.say();
}catch(Exception e){
}
}
}
package myclassLoader;
public class Person {
private String name;
private int age;
public Person(){
name = "Jack";
}
public void say(){
System.out.println(name);
}
public static void main(String[] args){
Person p = new Person();
p.say();
}
}