柔城

SOSOFT articles

java实现可有括号的android计算器

写了一个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  */

 

posted on 2013-12-06 21:01  柔城  阅读(2789)  评论(0编辑  收藏  举报

导航