标签:style color java 使用 os io 文件 ar 代码
java中的.java文件经过编译以后,就会生成类文件.class文件。class文件是以二进制字节码存放在硬盘中的。当我们需要使用或加载Java文件到JVM中的时候,会从硬盘中读取字节码的class文件,然后通过类加载器将class文件加载到JVM中。也就是说,所有的Java文件都是通过类加载器加载到JVM中的。当然类加载器也是一个Java文件。那么第一个类加载器又是如何加载到JVM中的呢?在启动JVM的时候,会调运一个本地方法findBootStrapClass方法加载最初始的那个ClassLoader,private native Class findBootstrapClass(String name),这个本地方法使用C++编写的。ExtClassLoader的父亲是BooststrapClassLoader
public class TestClassLoader { public static void main(String[] args) { // 当前对象的类加载器 ClassLoader loader = new TestClassLoader().getClass().getClassLoader(); // 从当前对象的类加载器想上找他的各个祖先 while (loader != null) { System.out.println(loader.getClass().getName()); loader = loader.getParent(); } // 知道找到最后的祖先是null System.out.println(loader); } } 输出: sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader null
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 首先检查name对应的Class是否已经被加载 Class c = findLoadedClass(name); //如果没有被加载 if (c == null) { long t0 = System.nanoTime(); //尝试让parentClassLoader去加载 try { if (parent != null) { //当parent不为null的时候,让parent去loadClass c = parent.loadClass(name, false); } else { //当parent为null的时候,就调运本地方法 c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { } //当parentClassLoader没有加载的时候 if (c == null) { long t1 = System.nanoTime(); //调运findClass方法去加载 c = findClass(name); } } if (resolve) { resolveClass(c); } return c; } }
public class MyClass extends Date { @Override public String toString() { return "hello world"; } }
public static void main(String[] args) throws Exception { String inputSrc = args[0];//原来的class文件的路径和文件名 String outputSrc = args[1];//加密以后存放的文件路径和文件名 FileInputStream fis = new FileInputStream(inputSrc); FileOutputStream fos = new FileOutputStream(outputSrc); //调用加密算法 cypher(fis, fos); fis.close(); fos.close(); } /** * 加密解密函数方法 * * @param is * @param os * @throws IOException */ private static void cypher(InputStream is, OutputStream os) throws IOException { int b = -1; while ((b = is.read()) != -1) { // 将0变成1,将1变成0 os.write(b ^ 0xff); } }
public class MyClassLoader extends ClassLoader { //要加载的类的路径 private String classSrc; public MyClassLoader() { } public MyClassLoader(String classSrc) { this.classSrc = classSrc; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { //先找到自己的加密的class文件的位置 String classFielName = classSrc + "\\" + name + ".class"; try { FileInputStream fis = new FileInputStream(classFielName); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //调运解密算法 cypher(fis, baos); fis.close(); byte[] bytes = baos.toByteArray(); //将读出来的二进制转换为Class字节码 return defineClass(null, bytes, 0, bytes.length); } catch (Exception e) { e.printStackTrace(); } return super.findClass(name); } }
//首先使用自己的类加载器去加载我们加密的class文件 //注意,这个地方的加载类的路径下的class应该是我们加密以后文件的位置 Class clazz = new MyClassLoader("E:/AllWorkspace/workspace1/classLoaderTest/bin/com/gusi/test").loadClass("MyClass"); //通过反射,测试我们的classLoader Date date = (Date) clazz.newInstance(); System.out.println(date.toString());
标签:style color java 使用 os io 文件 ar 代码
原文地址:http://blog.csdn.net/oatye40020/article/details/38755443