java2平台------javaSE、javaME、javaEE

java2平台体系:

        Java2平台包括:标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本。J2SE,J2ME和J2EE,这也就是SunONE(Open NetEnvironment)体系。

        J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入式系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于企业级应用开发,比如:服务器程序、分布式的网络程序的开发,如电子商务网站和ERP系统

javaSE、javaME、javaEE简介及比较:

       Standard Edition(标准版) J2SE 包含那些构成Java语言核心的类。比如:数据库连接、接口定义、输入/输出、网络编程

  Enterprise Edition(企业版) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类(组件)。比如:EJBservletJSPXML、事务控制

  Micro Edition(微缩版) J2ME 包含J2SE中一部分类,用于消费类电子产品的软件开发。比如:呼机、智能卡、手机、PDA机顶盒

  简单讲就是: J2SE: java 2 Standard edition (java 2 标准版)     J2EE: java 2 enterprise edition( Java 2 企业版)     J2ME: java 2 micro edition (Java 2 微缩版)

  他们的范围是:J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专有类

  应用场合,API的覆盖范围各不相同。

  笼统的讲,可以这样理解:J2SE是基础;压缩一点,再增加一些CLDC等方面的特性就是J2ME;扩充一点,再增加一些EJB等企业应用方面的特性就是J2EE。

  补充一点J2EE更恰当的说,应该是JAVA2企业开发的技术规范,不仅仅是比标准版多了一些类。J2EE又包括许多组件,如Jsp, Servlet,JavaBean, EJB,JDBC, JavaMail等。

  J2SE商业版本,标准版本 (Java2 Standard Edition) 定位在客户端,主要用于桌面应用软件的编程。

  J2SE 包含那些构成Java语言核心的类。

  比如:数据库连接、接口定义、输入/输出、网络编程

  J2SE 是J2EE的基础,他大量的JDK代码库是每个要学习J2EE的编程人员必须掌握的。

  从JDK 5.0开始,不再叫J2SE,改名为Java SE了,因为那个2已经失去了其应该有的意义。

 

J2SE的特性:

       (1)元数据

  J2SE 1.5 (并非最新版本)中的元数据特性提供这样的能力,即向 Java 类、接口、方法和字段关联附加的数据(如何关联?可以通过annotation)。这些附加的数据或者注释,可以被javac 编译器或其他工具读取,并且根据配置不同,可以被保存在类文件中,也可以在运行时使用 Java 反射API被发现

 
        元数据,就是“关于数据的数据”,越来越的开源框架都提供了“元数据”支持了,其实也就是注释支持。。功能也有很多啦。你可能用过Javadoc的注释自动生成文档。这就是元数据功能的一种。总的来说,元数据可以用来创建文档,跟踪代码的依赖性,执行编译时格式检查,代替已有的配置文件(如Hibernate也提供了注释配置)

  向 Java 平台增加元数据的一个主要原因是,使得开发工具和运行工具有一个通用的基础结构,以减少开发和部署所需的成本。工具可以使用元数据信息生成附加的源代码,或者在调试时提供附加信息。

  下面的例子用元数据工具创建了一个调试元数据注释,这些元数据注释然后又简单地在运行时显示出来。可以想像,大部分的元数据标签形成一个标准,即一个良好规范的集合。利用一个元数据处理工具,许多重复的代码编写步骤可以减少成一个简练的元数据标签。

     (2)泛型

  最先见到使用泛型的地方是在 Collections API 中。Collections API 提供可以被多个 Java 类型使用的公共功能性,比如 LinkedLists、ArrayLists 和 HashMaps。下一个例子使用 1.4.2 库和默认的javac 编译模式。

  泛型化 API 的用户必须使用 <> 符号简单地声明在编译类型中使用的类型。不需要任何类型转换,在本例中试图向一个 Integer 类型的集合中添加 String 对象将会在编译时被捕获

  因此,泛型允许 API 设计者提供这样的公共功能性:可以与多种数据类型一起使用,并可以在编译时出于类型安全对它进行检查

  设计自己的 Generic API 比起只是使用它们来说要稍微复杂一些。请从查看 java.util.Collection 源代码和 API 指南开始。

        泛型实现原理泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器拦截源程序中的非法输入,编译器编译带类型说明的集合时会去掉类型信息,对于参数化得泛型类型,getClass()方法的返回值和原始类型完全一样。

对于下面这个源程序:   

public class Oliver {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("str1");
        list.add("str2");
        String str = list.get(0);
    }
}

编译成Oliver.class后反编译的内容:

public class Oliver {
    public Oliver() {
    }
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("str1");
        list.add("str2");
        String str = (String) list.get(0);
    }
}

也就是说java的泛型只是在编译器做了参数限制,其实对性能并没有什么优化!

由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,比如在运行时利用反射可以往某个泛型集合中加入其它的类型数据。  
下面代码展示利用反射机制跳过编译器检查:  

public class Oliver {
    public static void main(String[] args) throws Exception {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.getClass().getMethod("add", Object.class).invoke(list, "ssss");
        System.out.println("list:" + list.get(0));
    }
}

 

输出结果:  
list:ssss

对于java泛型,Bruce Ecke(Thinking in Java作者)曾经给出这样的评论:  
Guess what. I really don't care. You want to call it "generics," fine, implement something that looks like C++ or Ada, that actually produces a latent typing mechanism like they do. But don't implement something whose sole purpose is to solve the casting problem in containers, and then insist that on calling it "Generics." Of course, Java has long precedence in arrogantly mangling well- accepted meanings for things: one that particularly stuck in my craw was the use of "design pattern" to describe getters and setters. In JDK 1.4 we were told some lame way to use assertions which was a backward justification for them being disabled by default. JDK 1.4 also had to invent its own inferior logging system rather than using the openly created, well-tested and well-liked Log4J. And we've also been told many times about how Java has been as fast or faster than C++, or about how one or another feature is great and flawless. I point to the threads implementation which has had major changes quietly made from version to version with not so much as a peep of apology or admission that "hey, we really screwed up here." Or maybe I was just not on that particular announcement list.

        (3)并发实用程序

  并发实用程序库由 Doug Lea 定义在 JSR-166 中,是 J2SE 1.5 平台中流行的并发软件包的一个特殊版本。它提供强大的、高级别的线程构造,包括 executors(这是一个线程任务框架)、线程安全队列、Timers、锁(包括原子锁)和其他同步原语

  著名的旗语(semaphore)是这样一个锁。旗语与现在使用的 wait 的使用方式相同,用于限制对一块代码的访问。旗语更加灵活,并且也允许许多并发的线程访问,同时允许您在获得一个锁之前对它进行测试。

       (4)性能

        1.5 版本承诺在可扩展性和性能方面的改进,新的重点在于启动时间和内存占用,使它更加易于以最大的速度部署应用程序

  最重大的一个更新是引入了 Hotspot JVM 中的类数据共享。该技术不仅在多个正在运行的 JVM 之间共享只读数据,而且改进了启动时间,因为核心的 JVM 类都是预先打包的。

(5)J2SE与Java 代码签名证书  

       Java 代码签名证书主要用于证明软件开发者开发的软件代码符合 Sun Java 规范。您可以使用Java 代码签名证书来为您的 Java 代码进行数字签名,以便通过互联网安全分发,使得最终用户能确信您的代码已经通过权威的第三方认证,而且没有在传输过程中被非法篡改和被破坏。 运行签名后就会显示软件发行商名称,否则会显示让用户不敢下载的警告“应用软件来源未知,继续?”。同时,签名后访问网络等都不会弹出烦人的警告框了,让应用更加安全.

       原理:

       代码签名的基础是PKI安全体系。代码签名证书由签名证书私钥公钥证书两部分组成。私钥用于代码的签名,公钥用于私钥签名的验证和证书持有者的身份识别。

        1. 发布者从CA机构(如VeriSign)申请 数字证书
        2. 发布者开发出代码;借助代码签名工具,发布者将使用MD5或SHA算法产生代码的 哈希值,然后用代码签名证书 私钥对该哈希值签名,从而产生一个包含代码签名和软件发布者的签名证书的软件包;
        3. 用户的运行环境访问到该软件包,并检验软件发布者的代码签名 数字证书的有效性。由于VeriSign根证书的公钥已经嵌入到用户的运行环境的可信根证书库,所以运行环境可验证发布者代码签名数字证书的真实性;
        4. 用户的运行环境使用代码签名 数字证书中含有的公钥解密被签名的哈希值;
        5. 用户的运行环境使用同样的算法新产生一个原代码的哈希值;
        6. 用户的运行环境比较两个哈希值。如果相同,将发出通知声明代码已验证通过。所以用户可以相信该代码确实由证书拥有者发布,并且未经篡改。
  整个过程对用户完全透明,用户将可以看到软件发布者提示信息,并可以选择是否信任该软件发布者。在选择信任软件发布者之后,运行所有该软件发布者签名的程序时将可以不再收到任何提示信息。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值