A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王震阳老师   /  2014-8-23 10:40  /  10094 人查看  /  108 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

ximi 中级黑马 2014-8-28 14:02:37
61#
领题了,谢谢了
回复 使用道具 举报
ximi 中级黑马 2014-8-28 16:35:34
62#
阳哥,文件已经已经提交,辛苦啦:D

ClassLoaderTest.zip

1.53 KB, 阅读权限: 200, 下载次数: 1

评分

参与人数 1技术分 +3 收起 理由
王震阳老师 + 3 赞一个!

查看全部评分

回复 使用道具 举报
请查收!

Test3.zip

9.63 KB, 阅读权限: 200, 下载次数: 3

评分

参与人数 1技术分 +3 收起 理由
王震阳老师 + 3 赞一个!

查看全部评分

回复 使用道具 举报

挺好:
  1. package classload;

  2. /**
  3. * @author:
  4. * @date:
  5. * @description:自定义ClassLoader
  6. */
  7. import java.io.File;
  8. import java.io.FileInputStream;
  9. import java.io.FileNotFoundException;
  10. import java.io.IOException;
  11. import java.lang.reflect.InvocationTargetException;
  12. import java.lang.reflect.Method;

  13. public class CompileClassLoader extends ClassLoader {
  14.         // 读入源文件转换为字节数组
  15.         private byte[] getSource(String filename) {
  16.                 File file = new File(filename);
  17.                 int length = (int) file.length();
  18.                 byte[] contents = new byte[length];
  19.                 FileInputStream fis = null;
  20.                 try {
  21.                         fis = new FileInputStream(file);
  22.                         int r = fis.read(contents);
  23.                         if (r != length) {
  24.                                 throw new IOException("IOException:无法读取" + filename);
  25.                         }
  26.                 } catch (FileNotFoundException e) {
  27.                         e.printStackTrace();
  28.                 } catch (IOException e) {
  29.                         e.printStackTrace();
  30.                 } finally {
  31.                         try {
  32.                                 if (fis != null) {
  33.                                         fis.close();
  34.                                 }
  35.                         } catch (IOException e) {
  36.                                 e.printStackTrace();
  37.                         }
  38.                 }
  39.                 return contents;
  40.         }

  41.         // 编译文件
  42.         public boolean compile(String javaFile) {
  43.                 System.out.println("正在编译" + javaFile);
  44.                 int ret = 0;
  45.                 try {
  46.                         // 调用系统命令编译文件
  47.                         Process process = Runtime.getRuntime().exec("javac " + javaFile);
  48.                         process.waitFor();
  49.                         ret = process.exitValue();
  50.                 } catch (IOException e) {
  51.                         e.printStackTrace();
  52.                 } catch (InterruptedException e) {
  53.                         e.printStackTrace();
  54.                 }
  55.                 return ret == 0;
  56.         }

  57.         // 重写findclass
  58.         @Override
  59.         protected Class<?> findClass(String name) throws ClassNotFoundException {
  60.                 Class<?> clazz = null;
  61.                 // 将文件的.替换为/,例如com.lyl.reflect.Reflect被替换为com/lyl/reflect/Reflect
  62.                 String fileStub = name.replace(".", "/");
  63.                 // java源文件名
  64.                 String javaFileName = fileStub + ".java";
  65.                 // 编译后的class文件名
  66.                 String classFileName = fileStub + ".class";
  67.                 File javaFile = new File(javaFileName);
  68.                 File classFile = new File(classFileName);
  69.                 // 当指定JAVA源文件存在,且class文件不存在,
  70.                 // 或者java源文件的修改时间比class文件修改时间晚则重新编译
  71.                 if (javaFile.exists()
  72.                                 && (!classFile.exists() || javaFile.lastModified() > classFile
  73.                                                 .lastModified())) {
  74.                         // 如果编译失败,或者class文件不存在
  75.                         if (!compile(javaFileName) || !classFile.exists()) {
  76.                                 throw new ClassNotFoundException("ClassNotFoundException:"
  77.                                                 + javaFileName);
  78.                         }
  79.                 }
  80.                 // 如果CLASS文件按存在,系统负责将该文件转换成Class对象
  81.                 if (classFile.exists()) {
  82.                         byte[] raw = getSource(classFileName);
  83.                         // 将ClassLoader的defineClass方法将二进制数据转换成Class对象
  84.                         int divindex = name.indexOf("\\");
  85.                         String javafilename = null;
  86.                         // 如果是某个盘里面的文件,要去掉文件的盘符
  87.                         if (divindex != -1) {
  88.                                 javafilename = name.substring(divindex + 1, name.length());
  89.                         }
  90.                         // 将字节数组转换为class实例
  91.                         clazz = defineClass(javafilename, raw, 0, raw.length);
  92.                 }
  93.                 // 如果clazz为null,表明加载失败,则抛出异常
  94.                 if (clazz == null) {
  95.                         throw new ClassNotFoundException(name);
  96.                 }
  97.                 return clazz;
  98.         }

  99.         // 定义主方法
  100.         public static void main(String[] args) throws ClassNotFoundException,
  101.                         SecurityException, NoSuchMethodException, IllegalArgumentException,
  102.                         IllegalAccessException, InvocationTargetException {
  103.                 // 如果运行该程序没有参数,则没有目标类
  104.                 if (args.length < 1) {
  105.                         System.out.println("缺少运行的目标类,请按如下格式运行源文件");
  106.                         System.out.println("java CompileClassLoader ClassName");
  107.                         System.exit(0);
  108.                 }
  109.                 // 第一个参数为需要运行的类
  110.                 String proClass = args[0];
  111.                 // 剩下的参数将作为目标类得参数
  112.                 String[] proArgs = new String[args.length - 1];
  113.                 System.arraycopy(args, 1, proArgs, 0, proArgs.length);
  114.                 CompileClassLoader ccl = new CompileClassLoader();
  115.                 // 加载需要运行的类
  116.                 Class<?> clazz = ccl.loadClass(proClass);
  117.                 Method main = clazz.getMethod("main", (new String[0]).getClass());
  118.                 Object[] argsArray = { proArgs };
  119.                 main.invoke(null, argsArray);
  120.         }
  121. }
复制代码
回复 使用道具 举报
Fengs 中级黑马 2014-8-29 01:56:31
65#
恩恩额!
回复 使用道具 举报
回复回复 领提领题
回复 使用道具 举报
有分送啦!
回复 使用道具 举报
虽然错过了,还是看看题目吧
回复 使用道具 举报
lvc 中级黑马 2014-9-1 03:50:07
69#
看看。。。
回复 使用道具 举报
领题看看
回复 使用道具 举报
看看学习一下。
回复 使用道具 举报
回帖领题~!
回复 使用道具 举报
吊啊.  我也想看看题...
回复 使用道具 举报
看看以前的题目,感受下
回复 使用道具 举报
新手来领题了
回复 使用道具 举报
刚学了这个,来试试
回复 使用道具 举报
做完了,请查收

ClassLoad.rar

1.16 KB, 阅读权限: 150, 下载次数: 1

评分

参与人数 1技术分 +2 收起 理由
王震阳老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
求技术分
回复 使用道具 举报
   黑马程序员训练营的入学这么严格, 难怪黑马程序员训练营敢喊不1万就业不给学费的口号,敢先培训后付款。容易得来的东西不懂得珍惜!

src.rar

1.68 KB, 阅读权限: 200, 下载次数: 1

求技术分

评分

参与人数 1技术分 +2 收起 理由
王震阳老师 + 2 很给力!

查看全部评分

回复 使用道具 举报
回帖领题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马