web analytics

存档

‘Java语言’ 分类的存档

如此理解面向对象编程

2012年12月13日 115 条评论 22,253 人阅读    

从Rob Pike 的 Google+上的一个推看到了一篇叫《Understanding Object Oriented Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论。

先看这篇教程是怎么来讲述OOP的。它先给了下面这个问题,这个问题需要输出一段关于操作系统的文字:假设Unix很不错,Windows很差。

这个把下面这段代码描述成是Hacker Solution。(这帮人觉得下面这叫黑客?我估计这帮人真是没看过C语言的代码)

public class PrintOS
{
	public static void main(final String[] args)
	{
		String osName = System.getProperty("os.name") ;
		if (osName.equals("SunOS") || osName.equals("Linux"))
		{
			System.out.println("This is a UNIX box and therefore good.") ;
		}
		else if (osName.equals("Windows NT") || osName.equals("Windows 95"))
		{
			System.out.println("This is a Windows box and therefore bad.") ;
		}
		else
		{
			System.out.println("This is not a box.") ;
		}
	}
}

然后开始用面向对象的编程方式一步一步地进化这个代码。

先是以过程化的思路来重构之。

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (26 人打了分,平均分: 4.81 )
Loading ... Loading ...

Resin服务器getResource揭秘

2012年1月5日 12 条评论 3,683 人阅读    

感谢网友 liuxiaori 继续分享其经历)这样的详细的图文并茂的文章让我很佩服!

前言

接上文“由一个问题到Resin ClassLoader的学习”,本文将以this.getClass().getResource(“/”).getPath()和this.getClass().getResourceAsStream(“/a.txt”)为例,一步步解析加载的过程。

调试环境

  1. 下载resin3.0.23的源码(http://www.caucho.com/download/resin-3.0.23-src.zip)。
  2. 部署到myeclipse中,有错误,本人忽略了。Resin可运行。
  3. 将EhCacheTestAnnotation部署到resin3.0.23中。
  4. 调试this.getClass().getResource(“/”).getPath()。

问题来了,无论如何也模拟不出来<compiling-loader>所造成的影响,一直输出:/D:/work_other/project/resin-3.0.23/bin/ 。无奈之下,采用了这种方式:使用两个eclipse,一个使用发布版本的,部署EhCacheTestAnnotation进行调试;另外一个部署resin3.0.23源码,调试到哪里对照看源码。

开始

1) this.getClass().getResource(“/”).getPath()

本次调试涉及的所有类加载器为:

EnvironmentClassLoader$24156236[web-app:http://localhost:8787/EhCacheTestAnnotation]

EnvironmentClassLoader$7806641[host:http://localhost:8787]

EnvironmentClassLoader$22459270[servlet-server:]

sun.misc.Launcher$AppClassLoader@7259da

sun.misc.Launcher$ExtClassLoader@16930e2

首先进入Class的getResource(String name)方法,如下图:

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (8 人打了分,平均分: 5.00 )
Loading ... Loading ...

由一个问题到 Resin ClassLoader 的学习

2011年12月28日 24 条评论 8,209 人阅读    

感谢网友 liuxiaori 分享其经历

背景

某日临近下班,一个同事欲取任何类中获取项目绝对路径,不通过Request方式获取,可是始终获取不到预想的路径。于是晚上回家google了一下,误以为是System.getProperty(“java.class.path”)-未实际进行测试,早上来和同事沟通,提出了使用这个内置方法,结果人家早已验证过,该方法是打印出CLASSPATH环境变量的值。

于是乎,继续google,找到了Class的getResource与getResourceAsStream两个方法。这两个方法会委托给ClassLoader对应的同名方法。以为这样就可以搞定(实际上确实可以搞定),但验证过程中却发生了奇怪的事情。

软件环境:Windows XP、Resin 3、Tomcat6.0、Myeclipse、JDK1.5

发展

我的验证思路是这样的:

  1. 定义一个Servlet,然后在该Servlet中调用Path类的getPath方法,getPath方法返回工程classpath的绝对路径,显示在jsp中。
  2. 另外在Path类中,通过Class的getResourceAsStream读取当前工程classpath路径中的a.txt文件,写入到getResource路径下的b.txt。

由于时间匆忙,代码没有好好去组织。大致能看出上述两个功能,很简单不做解释。

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (14 人打了分,平均分: 4.07 )
Loading ... Loading ...

一些有意思的算法代码

2011年11月29日 36 条评论 31,853 人阅读    

Keith Schwarz是一个斯坦福大学计算机科学系的讲师。他对编程充满了热情。他的主页上他自己正在实现各种各样的有意思的算法和数据结构,http://www.keithschwarz.com/interesting/, 目前这个网页上有88个(见下面的列表),但这位大哥要干135个,你可以看看他的To-Do List

从这个列表上,我们可以看到,他从去年7月份就在自己实现这些东西了,我把他实现的这些算法转过来,

  • 另一方面我希望这个事可以影响到一些正在学习编程的人。看看别人是怎么学习编程的,希望对你有借鉴作用。
Name Link Date Added Language Description
Binomial Heap (link) 7‑24‑2010 C++ An implementation of a binomial heap data structure for use as a priority queue.
Bounded Priority Queue (link) 7‑24‑2010 C++ An implementation of a priority queue with a fixed upper limit to its size..
Matrix (link) 7‑24‑2010 C++ A collection of classes for manipulating matrices.
VList (link) 8‑16‑2010 Java An implementation of the List abstraction backed by a VList.
Function Wrapper (link) 8‑16‑2010 C++ A C++ wrapper class around unary functions.
String (link) 8‑17‑2010 C++ An implementation of a string abstraction that uses the small string optimization.

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (21 人打了分,平均分: 4.86 )
Loading ... Loading ...

Eclipse开发Android应用程序入门:重装上阵

2011年4月8日 11 条评论 10,774 人阅读    

翻译:赵锟
原文:http://www.smashingmagazine.com/2011/03/28/get-started-developing-for-android-with-eclipse-reloaded/

在我们教程系列的第一部分中,我们使用Android和Eclipse开发了一个简单的饮茶计时器的应用程序。在第二部分,我们将继续开发这个程序,并给它增加一些其他的额外的功能。在开发的过程中,我们将给你介绍更多重要而强大的Android SDK特性,包括持久化数据存储,Activity和Intent,和共享用户首选项(译者注:类似于windows 的注册表的一种机制)。

跟着本教程,你需要上一篇教程中的代码,如果你想直接使用代码,你可以使用如下的指令从GitHub上check out出tutorial_par_1标记的代码:

$ git clone git://github.com/cblunt/BrewClock.git
$ cd BrewClock
$ git checkout tutorial_part_1

在GitHub中检出了代码后,你需要将代码倒入到Eclipse中的项目中:

  1. 运行 Eclipse 选择 File → Import…
  2. 在导入窗口, 选择 “Existing Projects into Workspace”并点击 “Next.”
  3. 在下一屏,点击 “Browse,”选择你从GitHub上clone出的代码目录。
  4. 点击“Finish” 将项目导入到Eclipse中。

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (8 人打了分,平均分: 4.25 )
Loading ... Loading ...

Eclipse开发Android应用程序入门

2011年4月7日 17 条评论 26,132 人阅读    

By Chris Blunt

翻译:赵锟
原文出处:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/

如今的移动设备应用程序开发充满着让人振奋的东西。功能强大的硬件支持,平板电脑,多样的软件平台(塞班 OS,iOS,WebOS,Windows Phone 7…),移动设备开发者前景充满了机会和挑战。

当你想要开始开发你的移动设备程序时,如此多的选择可能让你产生困扰。究竟应该选择神马平台?我应该学习神马语言?为你计划的项目选择神马工具?在本教程中,你将学会如何在Google公司的开源移动设备操作系统Android下开发应用程序。

为神马选Android

Android是一个基于Linux内核的开源平台, 并且被安装在来自于不同厂商的上千种设备中。Android将各种移动设备的硬件如 电子罗盘,摄像头,GPS,方向感应,等等暴露给你的应用程序。
阅读全文…

好烂啊有点差凑合看看还不错很精彩 (13 人打了分,平均分: 4.15 )
Loading ... Loading ...

JavaMail使用

2011年4月6日 5 条评论 4,250 人阅读    

本文由网友jjzhx_1211投递,感谢!

使用JavaMail需要两个包:activation-1.1.jar和mail-1.4.2.jar(当然现在最新的版本已经不止了),也可以直接包含Java SE 6的j2ee.jar,自带了前面的两个包。我把邮件功能写成了一个服务,发送邮件的数据都通过Map<String, String>类型的参数封装了起来。代码见文章最后

Session

Session 定义了一个基本的邮件会话,任何工作都是基于这个Session的。Session 对象需要一个 java.util.Properties 对象来得到类似 邮件服务器,用户名,密码这样的信息。Session 的构造函数是私有的,可以通过 getDefaultInstance() 方法来取得一个单一的可以被共享的默认session 如:

Properties props = new Properties();
Session session = Session.getDefaultInstance(props,null);

或者,可以使用 getInstance() 方法来创建一个唯一的 session如:

Properties props = new Properties();
Session session = Session.getInstance(props,null);

在这两种方法中 其中的 null 参数是一个 Authenticator 对象,在这里没有被使用的,所以就是null。在大多数案例中,使用一个共享session 已经做够了。

阅读全文…

分类: Java语言, Web开发 标签: ,
好烂啊有点差凑合看看还不错很精彩 (5 人打了分,平均分: 3.80 )
Loading ... Loading ...

JDK里的设计模式

2010年11月26日 3 条评论 12,820 人阅读    

下面是JDK中有关23个经典设计模式的示例,在stakeoverflow也有相应的讨论:
http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns

Structural(结构模式)

Adapter:
把一个接口或是类变成另外一种。

  • java.util.Arrays#asList()
  • javax.swing.JTable(TableModel)
  • java.io.InputStreamReader(InputStream)
  • java.io.OutputStreamWriter(OutputStream)
  • javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
  • javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

Bridge:
把抽象和实现解藕,于是接口和实现可在完全独立开来。

  • AWT (提供了抽象层映射于实际的操作系统)
  • JDBC

Composite:
让使用者把单独的对象和组合对象混用。

  • javax.swing.JComponent#add(Component)
  • java.awt.Container#add(Component)
  • java.util.Map#putAll(Map)
  • java.util.List#addAll(Collection)
  • java.util.Set#addAll(Collection)

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (10 人打了分,平均分: 4.50 )
Loading ... Loading ...

五大基于JVM的脚本语言

2010年7月19日 11 条评论 3,556 人阅读    

还记得以前本站的一篇文章《如何在Google App Engine上运行PHP》吗,其实那是借用 Quercus, 一个 100% 的用Java 实现的一个 PHP 引擎。今天,这样的东西太多了,能运行在Java的虚拟机JVM上的程序意味着有天然的跨平台性,现在JVM并不单单只能运行Java程序,在JVM上出现了若干使用Java虚拟机运行的脚本程序,比如什么PHP, Python, Ruby等等,这里有一篇文章评论了在JVM上的可以运行的排名前五脚本语言。他们分别是:

  1. Groovy。构建在强大的Java语言之上 并添加了从Python,Ruby和Smalltalk等语言中学到的诸多特征,为Java开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零),在开发Web,GUI,数据库或控制台程序时, 通过减少框架性代码 大大提高了开发者的效率。支持单元测试和模拟(对象),可以简化测试。无缝集成 所有已经存在的 Java对象和类库。直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。
  2. JRuby。一个纯Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。很多Java编写的Ruby IDE都是使用JRuby来解释语法的。
  3. Scala。一种多范式的编程语言,设计意图是要整合面向对象编程和函数式编程的各种特性。Scala编程语言近来抓住了很多开发者的眼球。它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Scala的名称表明,它还是一种高度可伸缩的语言。Scala的设计始终贯穿着一个理念:创造一种更好地支持组件的语言。
  4. Fantom 。Fantom 前身是 (Fan) 是一个基于 Java 和 .NET 平台的编程脚本引擎,用来在运行时产生 JVM 和 .NET 平台的字节码,该语言是面向对象的,跟 Groovy 和 JRuby 有点类似,可通过特定的接口来集成 Java 的类库。
  5. Jython。Jython由于继承了Java和Python二者的特性而显得很独特。其是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。

下面是一张表格比较了这五大JVM脚本语言:

阅读全文…

好烂啊有点差凑合看看还不错很精彩 (12 人打了分,平均分: 3.92 )
Loading ... Loading ...

四个流行的Java连接池

2010年6月2日 3 条评论 5,455 人阅读    

C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。(主页:http://sourceforge.net/projects/c3p0/

BoneCP 是一个开源的快速的 JDBC 连接池。BoneCP很小,只有四十几K(运行时需要log4jGoogle Collections的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。另外个人觉得 BoneCP 有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。(主页:http://jolbox.com/

DBCPDatabase Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。(主页:http://commons.apache.org/dbcp/

Proxool是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。(主页:http://proxool.sourceforge.net/

好烂啊有点差凑合看看还不错很精彩 (4 人打了分,平均分: 5.00 )
Loading ... Loading ...