Shawn Zhang's Programming Zone

软件,时代进步的推动者! 有事儿您Q我(Shawn)!♀飛雪傢銘♀的地盘欢迎您的到来!

导航

公告

2007年5月9日 #

J2EE学习经验:JSP学习总结

posted @ 2007-05-09 11:42 Shawn Zhang 阅读(222) 评论(0) 编辑

JAVA加密解密---自定义类加载器应用

  最近在研究JAVA CLASS LOADING技术,已实现了一个自定义的加载器。对目前自定义加载器的应用,还在探讨中。下面是自定义的CLASSLOADER在JAVA加密解密方面的一些研究。

JAVA安全

    JAVA是解释执行的语言,对于不同的操作平台都有相应的JVM对字节码文件进行解释执行。而这个字节码文件,也就是我们平时所看到的每一个.class文件。

    这是我们大家都知道的常识,也就是由.java文件,经过编译器编译,变成JVM所能解释的.class文件。

    而这个过程,在现在公开的网络技术中,利用一个反编译器,任何人都可以很容易的获取它的源文件。这对于很多人来说是不希望看到的。

    对于加密解密技术,我懂的不多,有些可以利用某种技术“模糊”JAVA类文件。这样能够使反编译的难度增加。但估计反编译器的技术水平也在不断提升,导致 这种方法层层受阻。另外还有很多其他的技术也可以实现对JAVA文件的加密解密。我现在所想要研究的,就是其中的一种。

    JAVA的灵活性使反编译变得容易,同时,也让我们的加密解密的方法变得灵活。

利用自定义的CLASSLOADER

参照:http://www.blogjava.net/realsmy/archive/2007/04/18/111582.html

JAVA中的每一个类都是通过类加载器加载到内存中的。对于类加载器的工作流程如下表示:
1.searchfile()
找到我所要加载的类文件。(抛除JAR包的概念,现在只是要加载一个.class文件)
2.loadDataClass()
读取这个类文件的字节码。
3.difineClass()
加载类文件。(加载的过程其实很复杂,我们现在先不研究它。)

    从这个过程中我们能很清楚的发现,自定义的类加载能够很轻松的控制每个类文件的加载过程。这样在第二步(loadDataClass)和第三步(difineClass)之间,我们将会有自己的空间灵活的控制这个过程。

我们加密解密的技术就应用到这里。

加密解密

    JAVA加密解密的技术有很多。JAVA自己提供了良好的类库对各种算法进行支持。对于采用哪种算法,网络上说法不一,自己去GOOGLE一下吧。

下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子。

首先,生成一个密钥KEY。
我把它保存到key.txt中。这个文件就象是一把钥匙。谁拥有它,谁就能解开我们的类文件。代码参考如下:
package com.neusoft.jiami;

import java.io.File;
import java.io.FileOutputStream;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

class Key {

    
private String keyName;

    
public Key(String keyName) {
        
this.keyName = keyName;
    }


    
public void createKey(String keyName) throws Exception {

        
// 创建一个可信任的随机数源,DES算法需要
        SecureRandom sr = new SecureRandom();
        
// 用DES算法创建一个KeyGenerator对象
        KeyGenerator kg = KeyGenerator.getInstance("DES");
        
// 初始化此密钥生成器,使其具有确定的密钥长度
        kg.init(sr);
        
// 生成密匙
        SecretKey key = kg.generateKey();
        
// 获取密钥数据
        byte rawKeyData[] = key.getEncoded();
        
// 将获取到密钥数据保存到文件中,待解密时使用
        FileOutputStream fo = new FileOutputStream(new File(keyName));
        fo.write(rawKeyData);
    }


    
public static void main(String args[]) {
        
try {
            
new Key("key.txt");
        }
 catch (Exception e) {
            e.printStackTrace();
        }


    }

}

第二步,对我们所要进行加密的类文件进行加密。

    比如我有一个DigestPass类,已经被正常编译好生成DigestPass.class文件。此时,这个类文件是任何人都可以用的。因为系统的类加 载器可以自动的加载它。那么下一步,我们要做的就是把这个类文件加密。使系统的类加载器无法读取到正确的字节码文件。参考代码如下:
package com.neusoft.jiami;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class JiaMi {

    
public static void main(String[] args) throws Exception {

        
// DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();
        
// 获得密匙数据
        FileInputStream fi = new FileInputStream(new File("key.txt"));
        
byte rawKeyData[] = new byte[fi.available()];
        fi.read(rawKeyData);
        fi.close();
        
// 从原始密匙数据创建DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(rawKeyData);
        
// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);
        
// Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance("DES");
        
// 用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, key, sr);
        
// 现在,获取要加密的文件数据
        FileInputStream fi2 = new FileInputStream(new File("DigestPass.class"));
        
byte data[] = new byte[fi2.available()];
        fi2.read(data);
        fi2.close();
        
// 正式执行加密操作
        byte encryptedData[] = cipher.doFinal(data);
        
// 用加密后的数据覆盖原文件
        FileOutputStream fo = new FileOutputStream(new File("DigestPass.class"));
        fo.write(encryptedData);
        fo.close();
    }

}


第三步,用自定义的CLASSLOADER进行加载。参考代码如下:
package com.neusoft.jiami;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import com.neusoft.classloader.MyClassLoader;

public class JieMi {

    
public static void main(String[] args) throws Exception {

        
// DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();
        
// 获得密匙数据
        FileInputStream fi = new FileInputStream(new File("key.txt"));
        
byte rawKeyData[] = new byte[fi.available()];// = new byte[5];
        fi.read(rawKeyData);
        fi.close();
        
// 从原始密匙数据创建一个DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(rawKeyData);
        
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个SecretKey对象
        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);
        
// Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance("DES");
        
// 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, key, sr);
        
// 现在,获取数据并解密
        FileInputStream fi2 = new FileInputStream(new File("DigestPass.class"));
        
byte encryptedData[] = new byte[fi2.available()];
        fi2.read(encryptedData);
        fi2.close();
        
// 正式执行解密操作
        byte decryptedData[] = cipher.doFinal(encryptedData);
        
// 这时把数据还原成原有的类文件
        
// FileOutputStream fo = new FileOutputStream(new
        
// File("DigestPass.class"));
        
// fo.write(decryptedData);
        
// 用解密后的数据加载类并应用
        MyClassloader mcl = new MyClassloader("E:/");
        Class cl 
= mcl.loadClass(decryptedData, "com.neusoft.jiami.DigestPass");
        DigestPass dp 
= cl.newInstance();
    }

}

这样,我们就完成了类的加密解密。这个过程留给我们修改的空间还很多。我也在理解过程中。

总结

自定义的类加载器能够灵活的控制类的加载过程。从而可以实现一些我们所要的功能。

     但是,即使是这样的加密技术,对于某些高手来说,依然是脆弱的。我们所需要做的就是,理解这其中的过程,掌握这样的技术,最终能够应用到我们自己的实际项目中来。

posted @ 2007-05-09 11:15 Shawn Zhang 阅读(661) 评论(0) 编辑

java中使用MD5加密算法进行加密

  在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算法,希望能抛砖引玉。

    (一)消息摘要简介

    一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。消息 摘要是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前 广泛使用的算法有MD4、MD5、SHA-1.

    消息摘要有两个基本属性:

    两个不同的报文难以生成相同的摘要难以对指定的摘要生成一个报文,而可以由该报文反推算出该指定的摘要代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5

    (二)对字符串进行加密

    /**利用MD5进行加密
     * 
@param str  待加密的字符串
     * 
@return  加密后的字符串
     * 
@throws NoSuchAlgorithmException  没有这种产生消息摘要的算法
     * 
@throws UnsupportedEncodingException  
     
*/

    
public String EncoderByMd5(String str) throws NoSuchAlgorithmException, 
UnsupportedEncodingException{
        
//确定计算方法
        MessageDigest md5=MessageDigest.getInstance("MD5");
        BASE64Encoder base64en 
= new BASE64Encoder();
        
//加密后的字符串
        String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
        
return newstr;
    }

    调用函数:String str="0123456789"

     System.out.println(EncoderByMd5(str));

    输出:eB5eJF1ptWaXm4bijSPyxw==

    (三)验证密码是否正确

    因为MD5是基于消息摘要原理的,消息摘要的基本特征就是很难根据摘要推算出消息报文,因此要验证密码是否正确,就必须对输入密码(消息报文)重新计算其 摘要,和数据库中存储的摘要进行对比(即数据库中存储的其实为用户密码的摘要),若两个摘要相同,则说明密码正确,不同,则说明密码错误。

    /**判断用户密码是否正确
     * 
@param newpasswd  用户输入的密码
     * 
@param oldpasswd  数据库中存储的密码--用户密码的摘要
     * 
@return
     * 
@throws NoSuchAlgorithmException
     * 
@throws UnsupportedEncodingException
     
*/

    
public boolean checkpassword(String newpasswd,String oldpasswd) throws NoSuchAlgorithmException, 
UnsupportedEncodingException{
        
if(EncoderByMd5(newpasswd).equals(oldpasswd))
            
return true;
        
else
            
return false;
    }

posted @ 2007-05-09 11:13 Shawn Zhang 阅读(327) 评论(0) 编辑

在Eclipse中运行带参数的 Java 程序

中文版:
  1、打开“运行”菜单,点击“运行(N)...”按钮,进入运行配置界面。
  2、在左侧选择要运行的程序,然后点击右侧“(x)=自变量”标签,在下面的“程序自变量(A):”文本框中输入程序运行需要的参数。
  3、点击下面的“运行(R)”按钮运行程序。

    英文版:
  1、打开“Run”菜单,点击“Run...”按钮,进入运行配置界面。
  2、在左侧选择要运行的程序,然后点击右侧“(x)=Arguments”标签,在下面的“Program arguments:”文本框中输入程序运行需要的参数。
  3、点击下面的“Run”按钮运行程序。

posted @ 2007-05-09 11:11 Shawn Zhang 阅读(61) 评论(0) 编辑

.NET与J2EE并存的局面还会持续很长时间

  2005年,开发平台可谓热闹非凡,重量级的软件公司纷纷推出新的开发平台和开发工具。主打。NET的微软公司在2005年第4季度,隆重推出了酝酿已久 的Visual Studio 2005及其相关的软件。其发布活动将在全球90多个国家先后举行,并且在国内巡展了20个城市,其宣传力度之大前所未有。可见微软对这个五年磨一剑的产 品极为重视,把它视为今后开发平台的一注重量级筹码。

    微软也试图通过这个产品与诸多的J2EE开发工具,特别是Tiger(J2SE 5.0)相抗衡。而J2EE阵营的主要开发工具厂商巨头IBM,也推出了最新版本Eclipse 3.1 RC4.Eclipse从3.1 M4开始支持J2SE 5.0的开发,IBM认为J2SE 5.0的发布是Java语言发展史上一个重要里程碑,是迄今为止在Java编程方面所取得的最大进步。

    Borland公司也推出了Together 2006和Delphi 2006等产品。随着这些开发平台的相继推出,那么在未来,开发平台将展开新一轮的激烈竞争,各个公司力图在整个开发平台市场上重新洗牌。

    关于J2EE和.NET之间的讨论已经持续很多年了,未来这个争论必将继续下去,孰优孰劣仍然很难下结论。事实上,笔者认为无论怎样比较,。.NET和J2EE都各有特长,两者都是十分优秀的开发平台,短时间内谁也不可替代对手。之所以说选择哪种开发平台,除了要看软件开发人员对语言的掌握能力 及个人喜好,也要根据开发内容和企业具体情况、具体需求而定。

    J2EE平台:更开放

    开放性是J2EE的一个重要特点,这也是Java发展的生命源泉。Sun公司在其发展中起着关键性作用,同时很多世界级公司如IBM、BEA、甲骨文等,都是其忠实盟友。这些都决定了开发工具是少不了的。

    由于Java的开放性特点,很多厂商都会创建自己的开发工具。右表中提到的是几家主要公司的Java开发工具。此外还有甲骨文公司的 Jdeveloper、赛门铁克公司的 Visual Cafe for Java、Adobe公司的JRUN以及Apache公司的ANT等也是常见的开发工具。

    .NET平台:易上手

    至于由微软开发的.NET平台下的开发工具,主要是基于Visual Studio系列的商业开发工具……NET最大特点就是容易上手,是软件开发人员入门的较好选择。优异的用户界面反应速度以及与Windows的整合度, 可以使软件人员较快地构建出用户界面比较好的应用程序。

    其实作为一个开发平台,.NET和Java都非常成熟和稳定。但.NET比Java的诞生晚了六年,这也恰恰在某种程度上增加了.NET的优越性。因为新技术总可以借鉴旧技术的发展经验,达到取长补短的效果。

    Visual Studio .NET是特性丰富的开发环境,通用语言的支持能力使开发人员能够在C++、VB和C#间自由转换。而且,Visual J#.NET还使Java开发人员可以使用所选的语言对。NET平台进行编程。编程人员利用Visual J#.NET创建基于。NET的应用程序,这些应用程序可以无缝地与使用任何其他。NET平台支持语言编写的。NET应用程序进行交互操作。

    有了Visual J#.NET,Java开发人员就可利用。NET框架的丰富工具(ADO.NET、ASP.NET和许多其他工具),这些工具的功能和简单性超过了Java开发工具包(JDK)规范中的功能。

    Visual Studio.NET的编辑器还支持XML文档、XML大纲、HTML和CSS的创建。比如,XML是在Java诞生之后,。NET诞生之前出现的技术, 所以。NET对于XML的整合会比较完善,而Java是后来将之加入的,整合程度自然比不上。NET.下面对微软最新发布的Visual Studio 2005的特点作一个简单介绍:微软把 Microsoft SQL Server 2005、Visual Studio 2005,以及将于明年推出的BizTalk Server 2006共同构成新一代企业级应用平台,其核心是Visual Studio 2005.

    利用Visual Studio 2005以及.NET Framework 2.0 这一企业级开发平台,广大开发人员及其团队能够开发出更加高效、安全和可靠的解决方案。Visual Studio 2005增加了一系列新的工具,其中,Visual Studio Team System是一个可扩展的、支持整个软件开发生命周期的工具平台,能使软件开发团队之间更好地协作,从而开发出现代化的、具有服务导向性的解决方案。

    Microsoft Visual Studio 2005 开发工具系列,有许多令人期盼已久的强化功能,包括提供更高的程序开发效率、更精简的程序代码、更佳的安全性能等。

    另外该工具系列还具备一些新特色,包括。NET Framework 2.0、ASP .NET 2.0、64-bit 程序开发支持、新的Windows Form程序设计以及对行动装置解决方案的全新开发支持。

    值得注意的是,首度推出的 Visual Studio Team System 是与开发工具完全整合的软件开发生命周期管理平台,与Agile方法论以及CMMI规范都相整合。

    Visual Studio Team System 除了在软件开发流程上更加严谨之外,软件开发的质量与时间也更易于掌控,同时,还将Visual Studio开发工具一贯支持个人开发者高生产力的优势,延伸到支持整个高效率及流程导向的开发团队。

    .NET在技术上的进步也开始体现在市场占有率上。如果以前大家对两种平台的认识是。NET可能无法胜任大规模的企业开发,那么最近的一系列调查数据则能够反驳这一观点。

    IDC公司在2005年10月份进行的一项调查发现,35.7%的大公司采用。NET来开发最重要的业务软件,而使用Java的比例只有25.3%。

    未来:代码管理工具比平台更重要

    但现在就说Java平台将会退出竞争市场还为时过早。毕竟Java平台已经发展了这么多年,不会因为。NET的胜利而消失。而且对于大型企业来说,由于现有规模和业务种类已经十分复杂,加之有多年遗留下来的应用系统,Java平台可能还是最适当的选择。

    对于软件开发人员来说,单学习哪种语言都不会找不到工作。一旦选择一方作为开发工具,惟“精实”才是惟一的出路。在此基础上去不断尝试新东西,才是IT行业的生存之道。

    对于企业来说,。NET和J2EE都有自己相对稳定的用户群。虽然这两个开发平台在很多方面都有很多相同或者相似的特性,但是不等于就可以互相替换,因为双方毕竟还有许多本身的独到之处,可称为是“独门绝技”。

    首先这两个开发平台的开发思路截然不同。J2EE依托于开放的工业标准,注重开源代码,强调跨平台的应用。而。NET则注重开放工具功能的日趋强大和丰 富,可以兼收其他产品的优点。比如在微软的开发平台上可以兼容20多个开发语言,简单易学,界面友好,是微软产品的一贯特征。

    然而微软的开发平台只能在Windows系统上运行,不支持开源代码。

    一般认为,在中小企业中,微软的开发平台将继续成为主流的产品。而在大中企业中,特别是那些使用UNIX系统或者具有多个操作系统、业务环境和IT环境十分复杂、对业务要求十分苛刻的大型企业中,J2EE将继续占有较大的市场。

    微软则试图将自己的开发平台向大中企业延伸,争夺J2EE原有的市场份额。J2EE则力图保住原有的市场和用户。争夺最激烈的是中型企业—它成为了两大阵营竞争的前沿阵地。这一争夺随着两大阵营的最新产品发布,将在2006年更趋白热化。

    谁将在2006年的竞争中占有上风,获得更多用户的青睐?那些开发平台推出的新特点和新工具能否得到用户的认可?能否经住实践的考验?谁也无法给出确切的答案。

    以Compuware公司为代表,在两大阵营夹缝中生存,推行“左右逢源”方针能否获得成功?能否走出一条融合之路,异军突起?也是我们在2006年关注的焦点之一。

    现在,市面上出现了一些软件公司推出了同时支持Java和。NET两种平台的开发工具,在二者之间架起了桥梁,Compuware公司就是其中的代表。在 Compuware看来,选择Java平台还是。NET平台已经不重要了,重要的是谁有一套完善、高效的软件代码管理工具。因此,两种平台并存的局面还会 持续很长时间。

posted @ 2007-05-09 11:04 Shawn Zhang 阅读(113) 评论(0) 编辑

回顾与展望,2006与2007的Java 技术

与以往不同的是,2006年对于Java是具有决定性意义的一年。对于Java命运最重要的是Sun决定以GPL许可方式发布其Java实现,它已经发布了HotSpot VM、javac编译器、Java ME。而更多的源代码将会逐渐在明年开放..这是许多人在一年前不敢想像的,更没有人想到Sun会选择GPL。

  但未来会怎样?这是一个大问题。尽管今年发生了如此多的大事,但这些事情将会如何引导发展方向? 似乎并不明显。在这篇文章中,我们将列出这些主要事件,并指出它们在2007年的发展预期。

开放源代码Java
      2006:Sun采用GPLv2发布其Java VM和编译器
  2007:期待类库、关注衍生版Java
  采用GPL发布Java编译器和VM表明Sun对于开放源代码Java是认真的,但要判断它的结果还为时过早。其一,Sun发布的是早期版Java SE 7,Sun不希望开放源代码影响在12月初发布的Java SE 6。Sun发布的代码还缺乏打造一个有用的Java环境所需要的类库。

  提供类库的挑战之一是,必须从数百万行代码中找出Sun可以在Java中使用、但无权以GPL方式发布的代码。其中一些代码已经有了开放源代码版替代品,但是,Sun还必须重新许可、编写、放弃一些代码,这是不可避免的。

  除此之外的一大问题是,在采用GPL后,人们会如何“处理”Java。 除了与在一些版本的Linux中包含Sun的JVM所牵涉的“政治性”问题和将JVM移植到Sun没有兴趣这么做的平台上外,人们还会做出一些不可预测的 事来。HotSpot的动态运行编译器会服务于其它语言的runtime吗?开发人员会通过修改编译器或者增添和删除功能构建多种不同版本的Java语言吗?这样的语言可能不能再叫Java了,但它叫什么呢?Java可能被用于某些特定域相关的语言, 使用"J"开头进行命名。

    2006:Sun制定并推广Java分销许可(Distro License for Java,DLJ)
  2007:Java分销许可还有用吗?
  如果你是一家Linux分销商,Sun现在无疑给了你当头一棒。在选定GPL前,Sun向Ubuntus和Debians推荐了Java分销许可,它使平台开发商能够以对它们的平台有意义的方式封装Java SE,使用户能够象apt-get那样获得JVM,而无需人工安装。

  有了GPL版Java,DLJ似乎就再无用武之地了,用户能够方便地修改类库、JVM。因此,只有在GPL Java被封装为.dpkg软件包时,DLJ才是必需的。

Java平台

   2006:Java SE 6发布
  2007:开发人员何时会采用它
  Java SE 6在12月中旬发布,比原定计划略微晚了一些。Java SE 6提供了包括XML Digital Signature在内的一些新API,更新了JDBC 4.0和JAXB 2.0等API,重新设计了图形渲染管道,提高了Swing的Windows的精度GTK。

  但是,由于开发人员、部署人员、用户在采用新版Java方面的动作比较缓慢,Java SE 6能够立即吸引人们吗?除非需要一些特定的新功能,安装全新的JVM值得吗?尽管性能有所提高━━特别是对于桌面应用软件而言,但在进入2007年时,SE 6不会成为许多人的缺省Java版本。


    2006:Java SE 6支持Java之外的其它语言
  2007:我们会在JVM上运行什么语言?
  Java SE 6中最有趣的变化是它内置地支持脚本语言。新的javax.script API使我们能够在Java中使用脚本语言引擎,在脚本语言和Java之间交换数据。Java SE 6提供了对JavaScript的内置支持,第三方厂商肯定会增添更多的脚本语言。

  由于Sun在9月份招聘了JRuby的开发人员,最可能的“下一种语言”是Ruby。很显然的是,Sun还在吸引Perl和PHP等其它脚本语言的开发人员。

  2006:JDK 7开发工作启动
  2007:与closures有关的争论达到顶峰
  JDK 7的开发已经在进行,但功能清单的发布还需要一段时间。JDK 7中最有争议的语言功能是在Java语言中增添closures。

在这一问题上有二种观点。其一是closures是否有必要,或者说closures带来的复杂性是否超过了它带来的好处。考虑到closures提供 的一些功能已经能够由inner类完成,closures能够减轻的“痛点”可能只不过是证明另一种语言结构是不必要的;第二种观点与closure的语 法有关,即它对简洁的期望是否会使Java closures不容易理解。

  2006:Java EE 5发布
  2007:EJB 3能够重新赢得开发人员的青睐吗?
  Sun在今年夏季发布了Java EE 5以及EJB 3.0企业对象框架。

  2007年值得关注的是EJB 3.0能否重新赢得放弃了EJB 2.x的开发人员的青睐。

  2006:Java ME在手机上非常普及
  2007:GPL ME会改变什么吗?
  在三大Java平台中,Java ME最不引人注目,但由于被应用到了手机上,它的应用比SE或EE要广泛得多。尽管有了一个开放源代码CLDC/MIDP平台,是否有人采用它还是个问题。手机制造商可能会选用当前的许可协议,但GPL ME对于其它领域的初创厂商是非常理想的。

posted @ 2007-05-09 10:46 Shawn Zhang 阅读(34) 评论(0) 编辑