写了一个android版的计算器,可以计算带括号的表达式,不过前提是:正确的表达式才行
小缺陷是没有做表达式括号的控制,现在还没有想到好的控制方式
1 package javaAdvanced; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 /** 7 * 类加载器学习 8 * 9 * @author cuiH 10 * Date: 13-12-6 11 */ 12 public class ClassLoaderTest { 13 public static void main(String[] args) { 14 System.out.println(ClassLoaderTest.class.getClassLoader().getClass().getName()); 15 /** 16 * result:sun.misc.Launcher$AppClassLoader 17 * AppClassLoader 加载的 18 */ 19 20 21 System.out.println(System.class.getClassLoader()); 22 /** 23 * result:null 24 * 加载器为null,说明是由bootstrap加载器进行加载的 25 */ 26 27 28 ClassLoader loader = ClassLoaderTest.class.getClassLoader(); 29 while (loader != null) { 30 System.out.println(loader.getClass().getName()); 31 loader = loader.getParent(); 32 } 33 System.out.println(loader); 34 /** http://www.cnblogs.com/sosoft/ 35 * result: 36 * sun.misc.Launcher$AppClassLoader [加载classPath各种jar包下面类] 37 * sun.misc.Launcher$ExtClassLoader [加载 Ext下面的各种jar包] 38 * null(Bootstrap)[加载rt.jar] 39 * 说明三个类加载器的父子关系 40 */ 41 } 42 43 /** 44 * web项目中的一个类加载器的测试(Tomcat中servlet DoGet方法的加载器) 45 * org.apache.catalina.loader.WebappClassLoader 46 * org.apache.catalina.loader.StandardClassLoader 47 * sun.misc.Launcher$AppClassLoader 48 * sun.misc.Launcher$ExtClassLoader 49 * 50 * 两个apache 两个java 51 * 这个放到web项目下好用。 52 */ 53 protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { 54 response.setContentType("text/html"); 55 PrintWriter out = response.getWriter(); 56 ClassLoader loader = this.getClass().getClassLoader(); 57 while (loader != null) { 58 out.println(loader.getClass().getName() + "</br>"); 59 loader = loader.getParent(); 60 } 61 out.close(); 62 } 63 64 } 65 66 /** 67 * jvm默认三个类加载器 http://www.cnblogs.com/sosoft/ 68 * 类加载器本质也是一个类 69 * java虚拟机第一个加载器是BootStrap,加载其他类加载器,然后加载类 70 * 71 * 默认的三个BootStrap ;AppClassLoader;ExtClassLoader 72 * 73 * 类加载器的委托方式: 74 * 加载方式:首先向上委托,,追寻到Bootstrap,上面有的话,直接加载,没有的话向下寻找。 75 * 因此自己写的System类无法被加载,因为找到最上面,就直接加载system类了 76 */ 77 78 79 /** 80 * 编写字节的类加载器 81 * 模板方法的设计模式 82 * 83 * 父类里有loaderClass方法 84 * 85 * 子类1(自己的代码) 86 * 子类2(自己的代码) 87 * 88 * 子类1和子类2的流程一样,但是具体实现方法不一样。 89 * 因此,将实现流程的代码写在父类中,具体的实现代码由子类实现 90 * 例如JDK中,ClassLoader.loaderClass使用的就是模板方法 91 * 92 * ClassLoader.loaderClass方法包括三步流程: 93 * 一:findLoaderClass()检查是否加载 94 * 二:父类加载器中调用 loaderClass方法 95 * 三: findClass查找类。 96 * 97 * 因此:要想写一个自己的类加载器,只需要覆盖findClass便可以实现 98 */