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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傅宇 中级黑马   /  2013-3-17 22:58  /  1460 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima;

  2. import java.io.ByteArrayOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;

  7. public class MyClassLoader extends ClassLoader {
  8.         public static void main(String[] args) throws Exception {
  9.                 String srcPath = args[0];
  10.                 String destDir = args[1];
  11.                 FileInputStream fis = new FileInputStream(srcPath);
  12.                 String destFilename = srcPath.substring(srcPath.lastIndexOf('\\') + 1);// ?
  13.                 String destPath = destDir + "\\" + destFilename;
  14.                 FileOutputStream fos = new FileOutputStream(destPath);
  15.                 cypher(fis, fos);
  16.         }

  17.         private static void cypher(InputStream ips, OutputStream ops)
  18.                         throws Exception {
  19.                 int b = -1;
  20.                 while ((b = ips.read()) != -1) {
  21.                         ops.write(b ^ 0xff);
  22.                 }
  23.                 ips.close();
  24.                 ops.close();
  25.         }

  26.         private String classDir;

  27.         @Override
  28.         protected Class<?> findClass(String name) throws ClassNotFoundException {
  29.                 // TODO Auto-generated method stub
  30. //                String classFileName = classDir + "\\" + name + ".class";
  31.                 String classFileName = classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class";
  32.                 try {
  33.                         FileInputStream fis = new FileInputStream(classFileName);
  34.                         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  35.                         cypher(fis, bos);
  36.                         fis.close();
  37.                         System.out.println("aaaaaaa");
  38.                         byte[] bytes = bos.toByteArray();
  39.                         return defineClass(null, bytes, 0, bytes.length);
  40.                 } catch (Exception e) {
  41.                         // TODO Auto-generated catch block
  42.                         e.printStackTrace();
  43.                 }
  44.                 return super.findClass(name);
  45.         }

  46.         MyClassLoader() {
  47.         }

  48.         MyClassLoader(String classDir) {
  49.                 this.classDir = classDir;
  50.         }
  51. }
复制代码
String destFilename = srcPath.substring(srcPath.lastIndexOf('\\') + 1);这行代码中截取到'\\'后的子串,其中“+1”是为了干什么?看不懂.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
D:\eclips\works1\javaenhance\bin\cn\classloader\ClassLoaderAttachment.class,假设这是要截取的字符串
String destFilename = srcPath.substring(srcPath.lastIndexOf('\\') + 1);这行代码中截取到'\\'后的子串,其中“+1”是为了干什么?看不懂.
classloader\ClassLoaderAttachment.classsrc //Path.lastIndexOf('\\') 表示这里的“\”的角标,如不加1则截得结果是: \ClassLoaderAttachment.classsrc
,多了个"\",这并不我们想要的结果

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
String destFilename = srcPath.substring(srcPath.lastIndexOf('\\') + 1);这行代码中截取到'\\'后的子串,如果不"+1”,最后截取到得字符串前面后有一个\.
  1. package com.Test;

  2. import java.util.ArrayList;
  3. import java.util.Arrays;

  4. public class ArryTest {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                
  11.                 String aa = "http:\\127.0.0.1";
  12.                 System.out.println(aa.substring(aa.lastIndexOf('\\')));//\127.0.0.1
  13.                 System.out.println(aa.substring(aa.lastIndexOf('\\')+1));//127.0.0.1

  14.         }

  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
lastIndexOf('\\')方法获取的是反向索引返回的是\\在字符串中最后一次出现的位置加入返回的是
substring(begin)返回的是字符串中的一部分,那么是那一部分呢?begin开始的位置,包含begin
substring(srcPath.lastIndexOf('\\') + 1);即\\后面的srcPath.lastIndexOf('\\')的位置往后在推一位,
例:c\\ab
lastIndexOf('\\');获取的为第三位3
要获取ab用subString()方法要从a开始即从4开始,所以要加1

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问,没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马