在编程中为所需要也[圣诞版]

明显,在Java中final
String中的值是一动不动的。大家还知晓String的+(拼接)运算会丢弃内存引用并于内存中再度开发地址,事实上也真这样。但final的变量真的是板上钉钉的呢?谨以此文打开程序员思路,跳出定式思维,希望本文会于您的程序员生涯带来新的沉思。

    
前把天和咱们的一个邮件服务商对接,双方要开展局部通讯,对方是java团队,而作.net团队之我们,只能宣布出来的凡一个wcf的basicbinding,想不

一个简约的例证

这个例子十分长远,早有长辈做了,但并无是怀有的程序员都碰过。通常喜欢“猎奇”的程序员对这个不会见生。

import java.lang.reflect.Field;

public class ChangeFinalString {

    public static void main(String[] args) throws Exception {
        final String s = "12345: caiyongji";
        System.out.println(s);
        System.out.println("hashcode: " + s.hashCode());
        Field f = String.class.getDeclaredField("value");
        f.setAccessible(true);
        char[] value = (char[]) f.get(s);
        value[0] = (char) 20851;
        value[1] = (char) 27880;
        value[2] = (char) 20844;
        value[3] = (char) 20247;
        value[4] = (char) 21495;
        System.out.println(s);
        System.out.println("hashcode: " + s.hashCode());
    }
}

事例中,通过final初始化一个String,然后照获取String类中名为value的Field,并再赋值value。执行后,你晤面发现String的hashcode值没有换,String的值也换了。另外,你还见面发觉这几实施简单代码的彩蛋。

到题目来了,对方非明了怎么去调用这个basic,可能他们水平发生接触菜,有接触尴尬,不得已我来钻研究,其实如果掌握发表之wsdl,对呀语言都是蛮简单的。

得出结论

关押!是无是觉得常规可以为打破,只要有足的技艺就是好当编程中也所要也?也许有些严谨的程序员会指出hashcode方法的实现依靠让JVM,并无能够一直体现内存的景况。说实话,你还无待牢记本文的例证,我只是怀念打破你初的思模式。

可,上面的连无是自己怀念说之的确结论。

下面,才是“圣诞版”真正的意义。

恐有点人会面以为收获颇富,我还要控制了一个面试题目的答案。没错,甚至像阿里、百度这样的国内巨头公司吃,有一些面试官(注意是有一些),确实会问有”final变量是不可变”这样的silly
question. 他们研究一派别语言甚至理解有具体落实之底细,甚至语言的bug。
但换个角度,在这样钻研的以,你是否考虑了而的时空成本、女对象跟后?!

 

接口论

作一个程序员,你是事情逻辑与代码实现之接口。没人在乎你怎么落实的事情,只于乎你的代码是否快捷、准确、易用、易拓展(具体讲,比如小ms返回结果,参数结构是否简单,是否好补加新效能)。同理,你以Java作为你实现工作逻辑的工具,你还足择Python、Node.js、Kotlin甚至Linux
shell脚本,那么你是不是如了解Java语言的享有实现?正使自当《如何成为10倍速的程序员》中所说之绝不记得。

自己是在召唤大家不请大解吗?
是的。

一:案例

反设计

如若管编程手段当成平种工具,无外乎语言、文档、框架,这些都可以算是工具的同样有些。不要试图用榔头打开螺丝钉,虽然你真的可得。但迅即是倒设计之。就如这事例一样,你得经过reflect改变final,但说白了,这种技术并不曾什么用,它会受您带来诸多烦劳,比如以进行时、在java版本升级时考虑兼容性。

因此,在利用同一栽“工具”时,要尽量按照工具制造者的思模式开展应用,所有这些所谓的“技巧”都是以倒设计。


末尾,专注、严谨、逻辑清晰是一个程序员的人格,但在技巧迭代如此快的怪背景下,当代码中追求极致是一个生人无法到位的(如果用控制技术的来衡量的话,你永远无法左右有术,并且,在技巧迭代过程被,你本来掌握的艺吧在渐渐淘汰。),别忘了公生蒙之情侣、家人及而的爱慕。

过结束圣诞即是初的等同年,祝所有的程序员朋友圣诞快乐(本文写给平安夜),同时以初的平年里开程序员新的、不同等的人生。

     
为了方便,我也未专门写什么代码了,就因此vs里面的wcf服务模板创建一下,详细内容如下:

 1     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
 2     // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。
 3     public class Service1 : IService1
 4     {
 5         public string GetData(int value)
 6         {
 7             return string.Format("You entered: {0}", value);
 8         }
 9 
10         public CompositeType GetDataUsingDataContract(CompositeType composite)
11         {
12             if (composite == null)
13             {
14                 throw new ArgumentNullException("composite");
15             }
16             if (composite.BoolValue)
17             {
18                 composite.StringValue += "Suffix";
19             }
20             return composite;
21         }
22     }

 

       
然后F5运转一下,就可以看到这样的一个wcf测试客户端,有劳动地方,有供的星星点点独艺术契约。

 

语言 1

 

二:java调用

  1. 使用web service client

     其实在eclipse的新建项目被生一个Web Service Client
模板,这个里面纵使得拿wsdl转换为proxy的java代码,有某些诸如C#未遭的服务引用,是休是,

脚就一律步一步操作下:

《1》 新建一个java project,或者dynamic
web project都是好的,本次测试就新建一个MyJavaTest 的project。

语言 2

 

《2》 然后下 WebService Client的模版
File  => Other =>Web Services => Web Service Client
即可。

语言 3

 

《3》在Service definition
选项中输入我们的wcf服务地方:http://localhost:54248/Service1.svc?wsdl,一定要注意

         在svc后面长一个wsdl,这样即便有利于java
proxy找到哈,然后左下比赛有一个“温度计”,调至start client 模式就是

       
好,然后继续点击下同样步,详细而下图:

语言 4

 

《4》
下图虽表示充分成好的代码用放入到啦一个目下,这个没什么好说的。

语言 5

 

《5》然后点击finish,现在若晤面发现,你基本上矣几只自动化的java类,便捷性和visual
studio有的平合龙。

语言 6

 

好了,自动化的接近都出来了,接下自己偏偏需要新建了一个进口的Program类,是匪是就可以敲得了。。。

 1 package com.datamip;
 2 
 3 import java.rmi.RemoteException;
 4 
 5 import org.tempuri.IService1Proxy;
 6 
 7 public class Program {
 8 
 9     public static void main(String[] args) throws RemoteException {
10 
11         IService1Proxy proxy = new IService1Proxy();
12 
13         String result = proxy.getData(12345);
14 
15         System.out.println(result);
16     }
17 
18 }

语言 7

然而若是吐槽之凡,IService1Proxy居然是一个看似,我还当是接口也,思维一贯吧~~~

 

  1. 使用wsimport小工具

       
其实java的jdk里面有很多之实用小器,其中虽有雷同缓缓wsimport.exe,它便可用来冲wsdl生成自动化的proxy类,和.net的svcutil的功用

凡如出一辙的。

语言 8

 

 
由于jdk路径都布置到了环境变量中,就可于cmd中扣一下wsimport需要的参数。

C:\Users\hxc>wsimport
缺少 WSDL_URI


用法: wsimport [options] <WSDL_URI>

\其中 [options] 包括:
  -b <path>                 指定 jaxws/jaxb 绑定文件或附加模式
                            (每个 <path> 都必须具有自己的 -b)
  -B<jaxbOption>            将此选项传递给 JAXB 模式编译器
  -catalog <file>           指定用于解析外部实体引用的目录文件
                            支持 TR9401, XCatalog 和 OASIS XML 目录格式。
  -d <directory>            指定放置生成的输出文件的位置
  -encoding <encoding>      指定源文件所使用的字符编码
  -extension                允许供应商扩展 - 不按规范
                            指定功能。使用扩展可能会
                            导致应用程序不可移植或
                            无法与其他实现进行互操作
  -help                     显示帮助
  -httpproxy:<host>:<port>  指定 HTTP 代理服务器 (端口默认为 8080)
  -keep                     保留生成的文件
  -p <pkg>                  指定目标程序包
  -quiet                    隐藏 wsimport 输出
  -s <directory>            指定放置生成的源文件的位置
  -target <version>         按给定的 JAXWS 规范版本生成代码
                            默认为 2.2, 接受的值为 2.0, 2.1 和 2.2
                            例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码
  -verbose                  有关编译器在执行什么操作的输出消息
  -version                  输出版本信息
  -wsdllocation <location>  @WebServiceClient.wsdlLocation 值
  -clientjar <jarfile>      创建生成的 Artifact 的 jar 文件以及
                            调用 Web 服务所需的 WSDL 元数据。
  -generateJWS              生成存根 JWS 实现文件
  -implDestDir <directory>  指定生成 JWS 实现文件的位置
  -implServiceName <name>   生成的 JWS 实现的服务名的本地部分
  -implPortName <name>      生成的 JWS 实现的端口名的本地部分

\扩展:
  -XadditionalHeaders              映射标头不绑定到请求或响应消息不绑定到
                                   Java 方法参数
  -Xauthfile                       用于传送以下格式的授权信息的文件:
                                   http://username:password@example.org/stock?wsdl
  -Xdebug                          输出调试信息
  -Xno-addressing-databinding      允许 W3C EndpointReferenceType 到 Java 的绑定
  -Xnocompile                      不编译生成的 Java 文件
  -XdisableAuthenticator           禁用由 JAX-WS RI 使用的验证程序,
                                   将忽略 -Xauthfile 选项 (如果设置)
  -XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名
                                   验证

\示例:
  wsimport stock.wsdl -b stock.xml -b stock.xjb
  wsimport -d generated http://example.org/stock?wsdl


C:\Users\hxc>

当下里面,大概知道下面4单参数就吓说了。

《1》 url: 你待扭转代理类的数据源,也就算是wsdl文件

《2》 -d:  生成的proxy文件要寄放的路线

《3》-p:   生成proxy类的包名。

《4》-keep:保存生成的文件称

对接下我们就cmd试一下:

C:\Users\hxc>wsimport http://localhost:54248/Service1.svc?wsdl -d c:\\2\\ -p com.datamip.proxy -keep
正在解析 WSDL...



正在生成代码...


正在编译代码...


C:\Users\hxc>

 

哼了,接下就是好以“文件夹2”中的proxy类copy到project中,如下图:

语言 9

 

关押起是勿是老完美,那接下要举行的政工虽是coding验证啦~~~

语言 10

 

说到底还有平等栽傻乎乎的措施,那就是是经fiddler抓取webservice通讯的参数,然后经过httppost模拟提交,也是可的。。。好了,本篇就跟豪门说到

此处,希望对你发帮助。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图