类加载,相关代码

    xiaoxiao2021-03-25  136

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Hashtable; import java.util.Iterator; import java.util.Scanner; import java.util.Set; public class PathClassLoader extends ClassLoader {         protected final ClassLoader parent;                  private final Hashtable<String,Class<?>> definedClass = new Hashtable<String,Class<?>>();                  public PathClassLoader(){                 this(PathClassLoader.class.getClassLoader());         }                  public PathClassLoader(ClassLoader parent){                 this.parent = parent;         }                  protected synchronized Class loaderClass(String name,boolean resolve)throws ClassNotFoundException{                                  Class<?> cls = findLoadedClass(name);                 if(cls == null && parent != null){                         try{                                 cls = parent.loadClass(name);                         }catch(ClassNotFoundException e){                                                          }                 }                                  if(cls == null){                         cls = findClass(name);                 }                                  if(resolve){                         resolveClass(cls);                 }                 return cls;         }                           public Class<?> loadClass(File file) throws ClassNotFoundException,IOException{                                  return loadClass(new FileInputStream(file));                          }          public Class<?> loadClass(InputStream in) throws ClassNotFoundException,IOException{                                  ByteArrayOutputStream out = new ByteArrayOutputStream();                 byte[] buf = new byte[1024];                 int l;                 for(;;){                         l= in.read(buf);                         if(l <= 0){                                 break;                         }                         out.write(buf, 0, l);                                          }                 in.close();                 return loadClass(out.toByteArray());         }         public Class<?> loadClass(byte[] b) throws ClassNotFoundException{                 return loadClass(b,0,b.length);         }                  public Class<?> loadClass(byte[] b,int off, int len) throws ClassNotFoundException{                 Class<?> cls = defineClass(null,b,off,len);                 definedClass.put(cls.getName(), cls);                 return loadClass(cls.getName());         }                  protected Class<?> findClass(String name) throws ClassNotFoundException{                 Class<?> cls = definedClass.get(name);                 if(cls == null){                         throw new ClassNotFoundException(name);                 }else{                         return cls;                 }                          }                  public void loadDirectory(File dir) throws ClassNotFoundException ,IOException{                 if(dir.isFile()){                         if(dir.getName().endsWith("class")){                                 loadClass(dir);                         }                         return;                 }else{                         for(File file: dir.listFiles()){                                 if(file.isDirectory()){                                         loadDirectory(file);                                 }else{                                         if(file.getName().endsWith("class")){                                                 loadClass(file);                                         }                                 }                         }                 }                          }                  public static Method[] findClassAllMethod(Class<?> want){                 Method[] lookup = want.getDeclaredMethods();                 System.out.println("类:"+want.getName()+"的方法共有"+lookup.length+".");                 StringBuffer methodName = new StringBuffer();                 for (int i = 0; i < lookup.length; i++) {                         System.out.println(getMethodName(i,methodName,lookup[i]));                         methodName.delete(0, methodName.length());                 }                 return lookup;         }                  public static String getMethodName(int i,StringBuffer methodName,Method currentMethod){                 methodName.append("方法")                         .append(i)                         .append(":")                         .append(currentMethod.getReturnType().toString())                         .append(" ")                         .append(currentMethod.getName())                         .append("(");                 Class<?>[] parameterTypes = currentMethod.getParameterTypes();                 if(parameterTypes.length != 0){                         for (int j = 0; ; j++) {                                 methodName.append(parameterTypes[j].toString());                                 if(j == parameterTypes.length -1){                                         break;                                 }                                 methodName.append(",");                         }                 }else{                         methodName.append(")");                         return methodName.toString();                 }                 methodName.append(")");                 return methodName.toString();         }                  public static Boolean doAction(String className,PathClassLoader dc){                 Boolean flag = true;                 Class<?> want;                 try{                         want = dc.findClass(className);                         if(want == null){                                 flag = false;                         }                         else{                                 Method[] lookup = findClassAllMethod(want);                                 doWhatMethod(lookup,want);                         }                 }catch(ClassNotFoundException e){                         e.printStackTrace();                 }                 /*                  * Object my = want.newInstance();                   * Method action = want.getDeclaredMethod("moveRight",int.class);                  * action.invoke(my,2);                  * if(want != null){                  *                 System.out.println("I want nobody but you");                  * }                  */                 return flag;         }                  public static void doWhatClassMessage(){                 System.out.println("*******************");                 System.out.println("提示:");                 System.out.println("请输入操作的类的名字:");                 System.out.println("输入bye退出");         }                  public static void doWhatClass(PathClassLoader dc){                 doWhatClassMessage();                 Scanner sc = new Scanner(System.in);                 do{                         try{                                 if(sc.hasNext()){                                         String className = sc.next();                                         if(className.equals("bye")){                                                 break;                                         }else{                                                 if(!doAction(className,dc)){                                                         System.out.println("没有找到该类"+className);                                                                                                          }                                                 continue;                                         }                                 }                         }catch(Exception e){                                 System.out.println("你输入的类的信息有误");                                 e.printStackTrace();                                 continue;                         }                 }while(true);                          }                  public static int getIntParameter(){                 int parameter = 0;                 Scanner sc = new Scanner(System.in);                 do{                         if(sc.hasNextInt()){                                 parameter = sc.nextInt();                                 System.out.println("int的parameter为:"+parameter);                                 break;                         }else{                                 System.out.println("你输入的参数数据有问题,请重新输入");                         }                 }while(true);                 return parameter;         }         public static String getStringParameter(){                 String parameter = null;                 Scanner sc = new Scanner(System.in);                 parameter = sc.next();                 return parameter;         }                  public static void doWhatMethodMessage(){                 System.out.println("***********************************");                 System.out.println("提示(目前只能执行基本数据类型的参数的方法):");                 System.out.println("请输入调用方法的序号:");                 System.out.println("输入back返回");                 System.out.println("***********************************");         }         public static void doWhatMethod(Method[] lookup,Class<?> want){                                  do{                         doWhatMethodMessage();                         Scanner sc = new Scanner(System.in);                         try{                                 if(sc.hasNextInt()){                                         int i = sc.nextInt();                                         System.out.println("获取方法");                                         System.out.println(getMethodName(i,new StringBuffer(),lookup[i]));                                         Class<?>[] parameterTypes = lookup[i].getParameterTypes();                                         Object myObject = want.newInstance();                                         Object[] parameter = new Object[parameterTypes.length];                                         for (int j = 0; j < parameter.length; j++) {                                                 System.out.println("请输入参数"+j);                                                 System.out.println("参数类型:"+parameterTypes[j].getName());                                                 if(parameterTypes[j].getName().equals("int")){                                                         parameter[j] = getIntParameter();                                                 }                                                 if(parameterTypes[j].getName().equals("String")){                                                         parameter[j] = getStringParameter();                                                 }                                                                                          }                                         System.out.println("开始执行方法*******");                                         lookup[i].invoke(myObject, parameter);                                         System.out.println("执行方法完毕*******");                                 }                                 if(sc.hasNext()){                                         String bye = sc.next();                                         if(bye.equals("back")){                                                 break;                                         }                                 }                         }catch(Exception e){                                 System.out.println("你输入的数据有误");                                 e.printStackTrace();                                 continue;                         }                 }while(true);         }         public static void printClassName(Object obj){                 System.out.println("The Class of " + obj + "is" + obj.getClass().getName());         }         public static void main(String[] args) {                 PathClassLoader dc = new PathClassLoader();                 //URL[] urls;                 try{                         dc.loadDirectory(new File("C:\\eclipseWork\\Proxy\\bin"));                         Set<String> key = dc.definedClass.keySet();                         Iterator<String> it = key.iterator();                         String className;                         while(it.hasNext()){                                 className = it.next();                                 System.out.println(className);                         }                         doWhatClass(dc);                 }catch(Exception err){                         System.err.println(err);                 }         } }
    转载请注明原文地址: https://ju.6miu.com/read-8261.html

    最新回复(0)