-------------------------------------------android培训、期待与您交流 -------------------------------------
java和其他语言不同的是,Java是运行于Java虚拟机(JVM)。这就意味着编译后的代码是以一种和平台无关的格式保存的,而不是某种特定的机器上运行的格式。这种格式和传统的可执行代码格式有很多重要的区别。具体来说,不同于C或者C++程序,Java程序不是一个独立的可执行文件,而是由很多分开的类文件组成,每个类文件对应一个Java类。 另外,这些类文件并不是马上加载到内存,而是当程序需要的时候才加载。 类加载器就是Java虚拟机中用来把类加载到内存的工具。而且,Java类加载器也是用Java实现的。这样你就不需要对Java虚拟机有深入的理解就可以很容易创建自己的类加载器了。
自定义类加载器(继承ClassLoader,重写findClass()方法,loadClass保存了类加载器的委托机制,所有最好不要重写loadclass方法,在类加载器中如果loadclass找不到类会调用findclass方法继续查找)
public class MyClassLoader extends ClassLoader{ /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String srcPath = args[0]; String destDir = args[1]; FileInputStream fis = new FileInputStream(srcPath); String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1); String destPath = destDir + "\\" + destFileName; FileOutputStream fos = new FileOutputStream(destPath); cypher(fis,fos); fis.close(); fos.close(); } private static void cypher(InputStream ips ,OutputStream ops) throws Exception{ int b = -1; while((b=ips.read())!=-1){ ops.write(b ^ 0xff); } } private String classDir; //必须重写findClass方法 @Override protected Class<?> findClass(String name) throws ClassNotFoundException { // TODO Auto-generated method stub String classFileName = classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class"; try { FileInputStream fis = new FileInputStream(classFileName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); cypher(fis,bos); fis.close(); System.out.println("aaa"); byte[] bytes = bos.toByteArray(); return defineClass(bytes, 0, bytes.length); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public MyClassLoader(){ } public MyClassLoader(String classDir){ this.classDir = classDir; } }