Java编程中使用XFire框架调用WebService程序接口

JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊。但就算是伤心,我们也还是要完成的。JAVA也不乏比较好的实现,如xfire,jersey,CXF。 这里我们就一起来看一下xfire的实现。

1)首先,当然是要下包啦,这个普通人都知道。http://xfire.codehaus.org/Download可以到这里去下,可以下all也可以下distribution。但建议还是下all的,免得一堆奇怪的问题搞得你一点信心都没了。

包弄下来了那么怎么办呢?放进项目里啊。貌似废话,但很多人就是不知道下下来要干什么用。

建一个新项目,比较我的是xfireWebservice,这里当然是建web项目啦。

我这里是把它所有的包都放到这里面了,毕竟我们写例子,就没必要挑三拣四了,随便点吧,如果想看看异常信息的朋友可以不把全部放进去,慢慢地加入,以后遇到错误也好排除,但我们这里就不那么做了,毕竟一般缺少什么类那些的异常没什么难看的,大家可以自己排除。

2)我们首先来了解一下xfire与其他webservice框架的不同,它最大的不同之处在于它需要一个接口,而且如果需要用xfire来调用相应的webservice必须知道接口的定义,感觉这里有点限制了。但除了这点,xfire调用webservice,那是相当的方便,就跟调用本地方法一样。我们直接来看例子:

首先是最重要的接口:

public interface IReaderService {
  public Reader getReader(String name,String password);
  public List<Reader> getReaders();
}
 有接口,当然也要有实现类,不然接口就没什么意义了。
public class ReaderService implements IReaderService{
  public Reader getReader(String name,String password) {
    return new Reader(name,password);
  } 

  public List<Reader> getReaders(){
    List<Reader> readerList = new ArrayList<Reader>();
    readerList.add(new Reader("shun1","123"));
    readerList.add(new Reader("shun2","123"));
    return readerList;
  }
}

也看一下JAVABEAN,Reader类:

public class Reader{
  private static final long serialVersionUID = 1L;
  private String name;
  private String password; 

  public Reader(){}
  public Reader(String name,String password) {
    this.name = name;
    this.password = password;
  }
    //Get/Set方法省略
  public String toString(){
    return "Name:"+name+",Password:"+password;
  } 

}

注意,我们这里的Reader类实现了Serializable接口,为什么呢?这里,首先我们需要了解webservice的原理,对于JAVA来讲,如果我们需要在互联网上传对象,很多人当然会想到序列化,对了,这里就是序列化,因为我们需要把reader作为参数来传递。这在以前的版本中是需要强制实现,否则会报错,但现在的最新的版本(其实最新的也是07年的,因为xfire已经停止开发,被apache合并为CXF项目,这个我们之后再讲)已经不需要了,至于是用什么方式实现的,我们这里暂时不深究,因为它已经被合并到CXF中,我们如果要深入学习,应该学习CXF较好。

3)当我们完成上面的接口和JAVABEAN的编写后,很多人会问,我看很多webservice都会有WSDL文件,那你这个怎么来的?在讲这个之前,我们来讨论一下什么是WSDL。也许很多公司提供的接口都还是只是一个HTTP地址,返回XML这样的格式,我们的也是。这有一个好处,也有一个坏处。好处是我们开发的难度小了,而坏处是我们需要提供给用户一堆说明文件,每个返回的XML标签是什么意思,这倒也没啥,但就是比较烦而已。而webservice呢,坏处就是我们开发的东西稍微多了点,而好处是我们不用再写那么多说明文件,因为有一个统一的说明,叫WSDL,这个是webservice的说明文档,是统一的,无论什么语言都一样,所以不存在谁看不懂的问题。

而这里,当我们部署完成xfire后,它就可以帮我们生成WSDL文件。

问题是怎么部署,这个其实也简单。我们在src目录下新建一个文件夹META-INF,再建它的一个字文件夹xfire,里面建立文件services.xml。之后的结构如下:

有人会问为什么要建到src目录下,其实不是规定建到这里的,但因为我们需要让开发工具帮我们自己部署这几个文件,所以我们放到这里,eclipse就可以帮我们自己部署到tomcat或者其他的容器中。注意,这个文件所在文件夹层次是固定的,不可以修改。

我们直接看一下servics.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
  <service>
    <!-- webserviceq名称,调用时需要指定这个 -->
    <name>readerService</name>
    <!-- 这个一般是自己公司的网址,意义不大 -->
    <namespace>http://test/HelloService</namespace>
    <!-- 接口类 -->
    <serviceClass>com.xfire.servlet.IReaderService</serviceClass>
    <!-- 实现类 -->
    <implementationClass>com.xfire.servlet.ReaderService</implementationClass>
  </service>
</beans>

看着注释一般都没问题的。

4)很多人以为这样就行了,不,还没行,你指定了这个,那别人怎么访问呢。怎么把相应的请求转发到xfire那里,让它进行处理呢。这里又需要修改web.xml了。
 修改后如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="WebApp_ID" version="3.0">
  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
  </servlet> 

  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
</web-app>

其实也就是添加了一个servlet和对应的mapping。接下来,我们在浏览器上直接输入:

http://localhost:8080/xfireWebService/services/readerService?wsdl

我们可以看到:

这里显示的就是wsdl,它会显示我们定义的方法,返回的类型。后面有对WSDL的讲解。
5)上面四步完成后,我们就完成了webservice的部署了。别人就可以调用相应的webservice来访问我们的方法了。下面我们就用xfire提供的client来访问一下我们刚才发布的webservice:

public class ReaderClient {
  public static void main(String[] args) {
    //这里是创建一个service,需要传入一个接口类,因为我们后面必须调用相应的接口方法
    Service srcModel = new ObjectServiceFactory().create(IReaderService.class);
    //代理工厂,这里是为了后面创建相应的接口类
    XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
    //webservice地址,不需要加wsdl
    String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService"; 

    try {
      //利用工厂返回相应的接口类
      IReaderService readerService = (IReaderService)factory.create(srcModel,readerServiceUrl); 

      Reader reader = readerService.getReader("shun","123");
      System.out.println(reader);
    } catch (MalformedURLException e) {
      e.printStackTrace();
    }
  }
}

这样,我们看到输出结果为:

wsdl文件结构分析

WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。 本文将详细讲解WSDL文档的结构,并分析每个元素的作用。

一:WSDL定义

WSDL是一个用于精确描述Web服务的文档,WSDL文档是一个遵循WSDL XML模式的XML文档。WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。

一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。文章的下一部分将会详细介绍WSDL 的基本结构。

二:WSDL的基本结构--概述

如第一部分最后描述的那样,一个基本的WSDL文档包含7个重要的元素。下面将分别介绍这几个元素以及他们的作用。

WSDL 文档在Web服务的定义中使用下列元素:

·                Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。

·                Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。

·                Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。

·                PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。

·                Binding - 特定端口类型的具体协议和数据格式规范的绑定。

·                Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

·                Service- 相关服务访问点的集合。

WSDL的xml schema可以参照如下网址:http://schemas.xmlsoap.org/wsdl/

三:WSDL的基本结构--详述

本节将通过一个例子详细描述WSDL文档每个元素的作用。下面一个例子是一个简单的WSDL文档的内容,该文档的产生可以参见我的另外一篇文章:xfire开发实例--HelloWorld篇 。

一个简单的Web Service的WSDL文档,该服务支持名为sayHello的唯一操作,该操作通过在http上运行SOAP协议来实现的。该请求接受一个字符串name,经过处理后返回一个简单的字符串。文档如下:

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions
  targetNamespace="http://com.liuxiang.xfireDemo/HelloService"
  xmlns:tns="http://com.liuxiang.xfireDemo/HelloService"
  xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"
  xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      attributeFormDefault="qualified" elementFormDefault="qualified"
      targetNamespace="http://com.liuxiang.xfireDemo/HelloService">
      <xsd:element name="sayHello">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="1"
              name="name" nillable="true" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="sayHelloResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="1"
              name="out" nillable="true" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="sayHelloResponse">
    <wsdl:part name="parameters" element="tns:sayHelloResponse" />
  </wsdl:message>
  <wsdl:message name="sayHelloRequest">
    <wsdl:part name="parameters" element="tns:sayHello" />
  </wsdl:message>
  <wsdl:portType name="HelloServicePortType">
    <wsdl:operation name="sayHello">
      <wsdl:input name="sayHelloRequest"
        message="tns:sayHelloRequest" />
      <wsdl:output name="sayHelloResponse"
        message="tns:sayHelloResponse" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="HelloServiceHttpBinding"
    type="tns:HelloServicePortType">
    <wsdlsoap:binding style="document"
      transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="sayHello">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="sayHelloRequest">
        <wsdlsoap:body use="literal" />
      </wsdl:input>
      <wsdl:output name="sayHelloResponse">
        <wsdlsoap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="HelloService">
    <wsdl:port name="HelloServiceHttpPort"
      binding="tns:HelloServiceHttpBinding">
      <wsdlsoap:address
        location="http://localhost:8080/xfire/services/HelloService" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

types元素使用XML模式语言声明在WSDL文档中的其他位置使用的复杂数据类型与元素;

import元素类似于XML模式文档中的import元素,用于从其他WSDL文档中导入WSDL定义;
message元素使用在WSDL文档的type元素中定义或在import元素引用的外部WSDL文档中定义的XML模式的内置类型、复杂类型或元素描述了消息的有效负载;
portType元素和operation元素描述了Web服务的接口并定义了他的方法。portType元素和operation元素类似于java接口中定义的方法声明。operation元素使用一个或者多个message类型来定义他的输入和输出的有效负载;
Binding元素将portType元素和operation元素赋给一个特殊的协议和编码样式;
service元素负责将Internet地址赋给一个具体的绑定;

1、definitions元素

所有的WSDL文档的根元素均是definitions元素。该元素封装了整个文档,同时通过其name提供了一个WSDL文档。除了提供一个命名空间外,该元素没有其他作用,故不作详细描述。

下面的代码是一个definitions元素的结构:

<wsdl:definitions
  targetNamespace="http://com.liuxiang.xfireDemo/HelloService"
  xmlns:tns="http://com.liuxiang.xfireDemo/HelloService"
  xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"
  xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
</wsdl:definitions>

2、types元素

WSDL采用了W3C XML模式内置类型作为其基本类型系统。types元素用作一个容器,用于定义XML模式内置类型中没有描述的各种数据类型。当声明消息部分的有效负载时,消息定义使用了在types元素中定义的数据类型和元素。在本文的WSDL文档中的types定义:

<wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      attributeFormDefault="qualified" elementFormDefault="qualified"
      targetNamespace="http://com.liuxiang.xfireDemo/HelloService">
      <xsd:element name="sayHello">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="1"
              name="name" nillable="true" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="sayHelloResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="1"
              name="out" nillable="true" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </wsdl:types>

上面是数据定义部分,该部分定义了两个元素,一个是sayHello,一个是sayHelloResponse:

sayHello:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的参入传入部分;

sayHelloResponse:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的返回值;

3、import元素

import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。本例子中没有使用import元素。通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。

import的格式如下:

<wsdl:import namespace="http://xxx.xxx.xxx/xxx/xxx" location="http://xxx.xxx.xxx/xxx/xxx.wsdl"/>

必须有namespace属性和location属性:

namespace属性:值必须与正导入的WSDL文档中声明的targetNamespace相匹配;

location属性:必须指向一个实际的WSDL文档,并且该文档不能为空。

4、message元素

message元素描述了Web服务使用消息的有效负载。message元素可以描述输出或者接受消息的有效负载;还可以描述SOAP文件头和错误detail元素的内容。定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。在本文中的message元素的定义,本文档使用了采用文档样式的消息传递:

<wsdl:message name="sayHelloResponse">
    <wsdl:part name="parameters" element="tns:sayHelloResponse" />
  </wsdl:message>
  <wsdl:message name="sayHelloRequest">
    <wsdl:part name="parameters" element="tns:sayHello" />
  </wsdl:message>

该部分是消息格式的抽象定义:定义了两个消息sayHelloResponse和sayHelloRequest:

sayHelloRequest:sayHello操作的请求消息格式,由一个消息片断组成,名字为parameters,元素是我们前面定义的types中的元素;

sayHelloResponse:sayHello操作的响应消息格式,由一个消息片断组成,名字为parameters,元素是我们前面定义的types中的元素;

如果采用RPC样式的消息传递,只需要将文档中的element元素应以修改为type即可。

5、portType元素

portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口,都是定义了一个抽象类型和方法,没有定义实现。在WSDL中, portType元素是由binding和service元素来实现的,这两个元素用来说明Web服务实现使用的Internet协议、编码方案以及 Internet地址。

一个portType中可以定义多个operation,一个operation可以看作是一个方法,本文中WSDL文档的定义:

  <wsdl:portType name="HelloServicePortType">
    <wsdl:operation name="sayHello">
      <wsdl:input name="sayHelloRequest"
        message="tns:sayHelloRequest" />
      <wsdl:output name="sayHelloResponse"
        message="tns:sayHelloResponse" />
    </wsdl:operation>
  </wsdl:portType>

portType定义了服务的调用模式的类型,这里包含一个操作sayHello方法,同时包含input和output表明该操作是一个请求/响应模式,请求消息是前面定义的sayHelloRequest,响应消息是前面定义的sayHelloResponse。input表示传递到Web服务的有效负载,output消息表示传递给客户的有效负载。

6、binding

binding元素将一个抽象portType映射到一组具体协议(SOAO和HTTP)、消息传递样式、编码样式。通常binding元素与协议专有的元素和在一起使用,本文中的例子:

  <wsdl:binding name="HelloServiceHttpBinding"
    type="tns:HelloServicePortType">
    <wsdlsoap:binding style="document"
      transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="sayHello">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="sayHelloRequest">
        <wsdlsoap:body use="literal" />
      </wsdl:input>
      <wsdl:output name="sayHelloResponse">
        <wsdlsoap:body use="literal" />
      </wsdl:output>
(0)

相关推荐

  • 动态webservice调用接口并读取解析返回结果

    这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下. using System; using System.Collections; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Hishop.Plugins { /// <summary>

  • WebService 的简单封装接口调用方法

    此方法完成了简单WebService 的简单调用封装,实现了简单Webservice简单调用的统一操作,避免了每增加一个操作都必须增加一个接口方法 的囧状! /// <summary> /// 封装同一的接口调用方法 /// </summary> /// <param name="_strSql">传入的简单sql</param> /// <param name="_strConnNmae">连接数据库字符

  • Java调用WebService接口的方法

    本文实例讲述了Java调用WebService接口的方法.分享给大家供大家参考.具体如下: 这里讲述有参方法Add,代码如下: 复制代码 代码如下: public static void addTest() {         try ...{             Integer i = 1;             Integer j = 2;                         //WebService URL             String service_url =

  • MyEclipse开发一个webservice接口

    一直以来对于接口这个东西都很好奇,各种客户也一直在说那个什么什么数据我们提供给你们一个接口就好了,结果还是不是很明白.于是乎就有了下面的小故事,接下来我们就进入正文吧 ---大概可以分为这样的步骤 1:新建webservice project,Framework版本选择JAX-WS 2:编写测试类,写一个简单的AddUser方法 3:在webservice project 上面 new webservice 确定后,在project和接口主类同一目录会生成一个Delegate.Java 4:加入

  • java WSDL接口webService实现方式

    一.使用JDK生成WSDL的对象类 1.cmd进入JDK的bin文件中 执行命令 wsimport -keep -p com.demo.client http://localhost:8080/Demo/services/MyService?wsdl 比较常用的[options]有: 1). -d <directory> 在指定的目录生成class文件 2). -clientjar <jarfile> 在当前目录生成jar文件,结合-d <directory>可以在指定

  • Java编程中使用XFire框架调用WebService程序接口

    JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊.但就算是伤心,我们也还是要完成的.JAVA也不乏比较好的实现,如xfire,jersey,CXF. 这里我们就一起来看一下xfire的实现. 1)首先,当然是要下包啦,这个普通人都知道.http://xfire.codehaus.org/Download可以到这里去下,可以下all也可以下distr

  • java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); try { String str="2&1"

  • Java 编程中十个处理异常的建议

    一.尽量不要使用e.printStackTrace(),而是使用log打印. 反例: try{ // do what you want }catch(Exception e){ e.printStackTrace();} 正例: try{ // do what you want }catch(Exception e){ log.info("你的程序有异常啦,{}",e);} 理由: printStackTrace()打印出的堆栈日志跟业务代码日志是交错混合在一起的,排查异常日志不太方便

  • Java编程中10个最佳的异常处理技巧

    在实践中,异常处理不单单是知道语法这么简单.编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践.这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码.这还是一个提供给java程序员编写健壮代码的便利手册.Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践.在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能.在本文中,我们将尽量减少使用检查型异常,同时学会在Java编程中使用检查型VS非检查型异常

  • 深入理解Java编程中异常处理的优劣

    Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:好,不好和恶劣三种.同时提供了一些解决这些问题的技巧.首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作"不可检查&

  • java编程中自动拆箱与自动装箱详解

    什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameter); 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i = 100; ) 实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); (感谢@

  • 浅谈Java编程中string的理解与运用

    一,"=="与equals() 运行以下代码,如何解释其输出结果? public class StringPool { public static void main(String args[]) { String s0="Hello"; String s1="Hello"; String s2="He"+"llo"; System.out.println(s0==s1);//true System.out

  • Java编程中的构造函数详细介绍

    本文主要是为新手.对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法.希望走在java学习道路上的同行者可以有一个较为清晰的认知和理解.当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 1.构造函数的概念 很多java新手谈到构造函数就会犯晕,我们先来看看什么是构造函数. 首先,构造函数是函数的一种特殊形式,特殊在哪里?构造函数中不需要定义返回类型

  • Java编程中避免equals方法的隐藏陷阱介绍

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继承类作为面向对象语言中的等价关系的基础问题,要保证派生类的equal正确性语义所会面对的困难.Bloch这样写到: 除非你忘记了面向对象抽象的好处,否则在当你继承一个新类或在类中增加了一个值组件时你无法同时保证equal的语义依然正确 在<Programming in Scala>中的第28章演示

  • Java编程中实现Condition控制线程通信

    java中控制线程通信的方法 1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyAll()控制线程通信.不灵活. 2.利用Condition控制线程通信,灵活. 3.利用管道pipe进行线程通信,不推荐 4.利用BlockingQueue控制线程通信 本文就讲解利用Condition控制线程通信,非常灵活的方式. Condition类是用来保持Lock对象的协调调用. 对Lock不了解的可以参考:Java线程同步Lock同步锁代码示例

随机推荐