搜索词>>Java编程 耗时0.0020
  • Java编程软件有哪些_常用Java编程软件下载和安装

    Java编程软件有哪些?常用Java编程软件下载、安装和使用说明Java编程软件下载和安装_Java编程常用软件
  • Java web 编程规范 之 controller规范

    Java web 编程规范 之 controller规范Java web 编程规范 之 controller规范
  • Java编程中Spring Boot整合RabbitMQ

    Java编程中Spring Boot整合RabbitMQ实现消息中间件RabbitMQ的使用<p>Java编程中Spring Boot整合RabbitMQ实现消息中间件RabbitMQ的使用<br /> <br />  1 主要用spring-boot-starter-amqp来整合RabbitMQ和SpringBoot</p> <p> 2 pom.xml文件中加入依赖<br />  </p> <pre> <code class="language-xml"> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <!--<scope>provided</scope>--> </dependency></code></pre> <p> 3编写配置文件application.yml</p> <pre> <code>spring: application: name: rabbitmq-test rabbitmq: host: localhost port: 5672 username: guest password: guest</code></pre> 4 Java编程中编写Sender并使用注解@Component注册为spring框架容器组件 <pre> <code class="language-java">@Component public class Sender { @Autowired private AmqpTemplate amqpTemplate; public void send() throws Exception { String message= "hello" + new Date(); System.out.println("Sender:"+context); this.amqpTemplate.convertAndSend("test_queue_name",message); } }</code></pre> 5 Java编程中编写Reveiver并使用注解@Component注册为spring框架容器组件同时监听队列hello,并用RabbitHandler来处理请求。queues = "test_queue_name"这里的test_queue_name就是发送消息时候的队列名称 <pre> <code class="language-java">@Component @RabbitListener(queues = "test_queue_name") public class Receiver { @RabbitHandler public void process(String message){ System.out.println("Receiver:"+message); } }</code></pre> 6Java编程中编写刚刚用到的hello队列的配置类 <pre> <code class="language-java">@Configuration public class RabbitConfig { @Bean public Queue helloQueue() { return new Queue("test_queue_name"); } }</code></pre> 7 Java编程中编写单元测试类Test,调用Sender的方法发送message,这样Receiver就能自动监听并在主类哪里输出了 <pre> <code class="language-java">@SpringBootTest(classes = Application.class) @RunWith(SpringJUnit4ClassRunner.class) public class Test { @Autowired private Sender sender; @org.junit.Test public void hello() throws Exception { sender.send(); } }</code></pre>
  • java编程之java jwt token使用autho0-jwt框架使用(二)

    java编程之java jwt token使用,autho0的Java-jwt框架使用,java编程,java-jwt<h2>一、前言</h2> Java编程中使用jwt,首先你必须了解jwt是什么,长什么样子。如果你不了解可以先去本站另外一篇博客<a rel="" target="_blank"href="http://www.leftso.com/blog/220.html" rel="" target="_blank">什么是JWT?</a><br />   <h2>二、Java编程中jwt框架选择</h2> 在Java编程中,实现jwt标准的有很多框架,本博客采用的框架是auth0的java-jwt版本为3.2.0 <h2>三、什么是Java-JWT</h2> auth0的java-jwt是一个JSON WEB TOKEN(JWT)的一个实现。 <h2>四、安装下载相关依赖</h2> 如果你是采用<strong>maven</strong>的方式,在你的项目pom.xml文件中添加以下java-jwt的依赖片段: <pre> <code class="language-xml"><dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.2.0</version> </dependency></code></pre> 如果你是采用<strong>Gradle</strong>的方式,则添加以下内容: <pre> <code>compile 'com.auth0:java-jwt:3.2.0'</code></pre> <h2>五、java-jwt已经实现的算法</h2> 该库使用以下算法实现JWT验证和签名: <table class="table table-bordered table-hover"> <thead> <tr> <th>JWS</th> <th>算法</th> <th>介绍</th> </tr> </thead> <tbody> <tr> <td>HS256</td> <td>HMAC256</td> <td>HMAC with SHA-256</td> </tr> <tr> <td>HS384</td> <td>HMAC384</td> <td>HMAC with SHA-384</td> </tr> <tr> <td>HS512</td> <td>HMAC512</td> <td>HMAC with SHA-512</td> </tr> <tr> <td>RS256</td> <td>RSA256</td> <td>RSASSA-PKCS1-v1_5 with SHA-256</td> </tr> <tr> <td>RS384</td> <td>RSA384</td> <td>RSASSA-PKCS1-v1_5 with SHA-384</td> </tr> <tr> <td>RS512</td> <td>RSA512</td> <td>RSASSA-PKCS1-v1_5 with SHA-512</td> </tr> <tr> <td>ES256</td> <td>ECDSA256</td> <td>ECDSA with curve P-256 and SHA-256</td> </tr> <tr> <td>ES384</td> <td>ECDSA384</td> <td>ECDSA with curve P-384 and SHA-384</td> </tr> <tr> <td>ES512</td> <td>ECDSA512</td> <td>ECDSA with curve P-521 and SHA-512</td> </tr> </tbody> </table> <h2>六、如何使用java-jwt</h2> <strong>6.1.选择一种算法</strong> <p>  算法定义了一个令牌是如何被签名和验证的。它可以用HMAC算法的原始值来实例化,也可以在RSA和ECDSA算法的情况下对密钥对或密钥提供程序进行实例化。创建后,该实例可用于令牌签名和验证操作。</p> <p>在使用RSA或ECDSA算法时,只需要签署JWTs,就可以通过传递null值来避免指定公钥。当您需要验证JWTs时,也可以使用私钥进行操作<br /> <br /> 使用静态的字符密文或者key来获取算法器:<br />  </p> <pre> <code class="language-java">//HMAC Algorithm algorithmHS = Algorithm.HMAC256("secret"); //RSA RSAPublicKey publicKey = //Get the key instance RSAPrivateKey privateKey = //Get the key instance Algorithm algorithmRS = Algorithm.RSA256(publicKey, privateKey);</code></pre> 使用一个key提供者来获取算法:<br />   通过使用KeyProvider,您可以在运行时更改密钥,用于验证令牌签名或为RSA或ECDSA算法签署一个新的令牌。这是通过实现RSAKeyProvider或ECDSAKeyProvider方法实现的: <ul> <li><code>getPublicKeyById(String kid)</code>: 它在令牌签名验证中调用,它应该返回用于验证令牌的密钥。如果使用了关键的轮换,例如JWK,它可以使用id来获取正确的轮换键(或者只是一直返回相同的键)。</li> <li><code>getPrivateKey()</code>: 在令牌签名期间调用它,它应该返回用于签署JWT的密钥。</li> <li><code>getPrivateKeyId()</code>:在令牌签名期间调用它,它应该返回标识由getPrivateKey()返回的键的id的id。这个值比JWTCreator.Builder和keyid(String)方法中的值更受欢迎。如果您不需要设置孩子的值,就避免使用KeyProvider实例化算法。</li> </ul> 下面的代码片段将展示如何使用: <pre> <code class="language-java">final JwkStore jwkStore = new JwkStore("{JWKS_FILE_HOST}"); final RSAPrivateKey privateKey = //Get the key instance final String privateKeyId = //Create an Id for the above key RSAKeyProvider keyProvider = new RSAKeyProvider() { @Override public RSAPublicKey getPublicKeyById(String kid) { //Received 'kid' value might be null if it wasn't defined in the Token's header RSAPublicKey publicKey = jwkStore.get(kid); return (RSAPublicKey) publicKey; } @Override public RSAPrivateKey getPrivateKey() { return privateKey; } @Override public String getPrivateKeyId() { return privateKeyId; } }; Algorithm algorithm = Algorithm.RSA256(keyProvider); //Use the Algorithm to create and verify JWTs.</code></pre> <br /> <em>提示:对于使用JWKs的简单的键轮换,可以尝试JWKs-rsa-java库。</em><br /> <br /> <strong>6.2.创建一个签名的JWT token</strong><br /> 首先需要通过调用<code>jwt.create()</code>创建一个<code>JWTCreator</code>实例 <ul> <li>例如使用 <code>HS256算法:</code></li> </ul> <pre> <code class="language-java">try { Algorithm algorithm = Algorithm.HMAC256("secret"); String token = JWT.create() .withIssuer("auth0") .sign(algorithm); } catch (UnsupportedEncodingException exception){ //UTF-8 encoding not supported } catch (JWTCreationException exception){ //Invalid Signing configuration / Couldn't convert Claims. }</code></pre> <ul> <li>例如使用<code>RS256算法:</code></li> </ul> <pre> <code class="language-java">RSAPublicKey publicKey = //Get the key instance RSAPrivateKey privateKey = //Get the key instance try { Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey); String token = JWT.create() .withIssuer("auth0") .sign(algorithm); } catch (JWTCreationException exception){ //Invalid Signing configuration / Couldn't convert Claims. }</code></pre> 如果Claim不能转换为JSON,或者在签名过程中使用的密钥无效,那么将会抛出<code>JWTCreationException</code>异常。<br /> <br /> <strong>6.3.验证令牌</strong><br />   首先需要通过调用jwt.require()和传递算法实例来创建一个JWTVerifier实例。如果您要求令牌具有特定的Claim值,请使用构建器来定义它们。方法build()返回的实例是可重用的,因此您可以定义一次,并使用它来验证不同的标记。最后调用verifier.verify()来验证token <ul> <li>例如使用 <code>HS256算法的时候:</code></li> </ul> <pre> <code class="language-java">String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE"; try { Algorithm algorithm = Algorithm.HMAC256("secret"); JWTVerifier verifier = JWT.require(algorithm) .withIssuer("auth0") .build(); //Reusable verifier instance DecodedJWT jwt = verifier.verify(token); } catch (UnsupportedEncodingException exception){ //UTF-8 encoding not supported } catch (JWTVerificationException exception){ //Invalid signature/claims }</code></pre> <ul> <li>例如使用 <code>RS256算法的时候:</code></li> </ul> <pre> <code class="language-java">String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE"; RSAPublicKey publicKey = //Get the key instance RSAPrivateKey privateKey = //Get the key instance try { Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey); JWTVerifier verifier = JWT.require(algorithm) .withIssuer("auth0") .build(); //Reusable verifier instance DecodedJWT jwt = verifier.verify(token); } catch (JWTVerificationException exception){ //Invalid signature/claims }</code></pre> 如果令牌有一个无效的签名,或者没有满足Claim要求,那么将会抛出JWTVerificationException异常<br /> <br /> <strong>6.4.jwt时间的验证</strong><br /> JWT令牌可能包括可用于验证的DateNumber字段: <ul> <li>这个令牌发布了一个过期的时间 <code>"iat" < TODAY</code></li> <li>这个令牌还没过期 <code>"exp" > TODAY</code> and</li> <li>这个令牌已经被使用了. <code>"nbf" > TODAY</code></li> </ul> 当验证一个令牌时,时间验证会自动发生,导致在值无效时抛出一个JWTVerificationException。如果前面的任何一个字段都丢失了,那么在这个验证中就不会考虑这些字段。<br /> 要指定令牌仍然被认为有效的余地窗口,在JWTVerifier builder中使用accept回旋()方法,并传递一个正值的秒值。这适用于上面列出的每一项。 <pre> <code class="language-java">JWTVerifier verifier = JWT.require(algorithm) .acceptLeeway(1) // 1 sec for nbf, iat and exp .build();</code></pre> 您还可以为给定的日期声明指定一个自定义值,并为该声明覆盖缺省值。 <pre> <code class="language-java">JWTVerifier verifier = JWT.require(algorithm) .acceptLeeway(1) //1 sec for nbf and iat .acceptExpiresAt(5) //5 secs for exp .build();</code></pre> 如果您需要在您的lib/app中测试此行为,将验证实例转换为basever可视化,以获得verific.build()方法的可见性,该方法可以接受定制的时钟。例如: <pre> <code class="language-java">BaseVerification verification = (BaseVerification) JWT.require(algorithm) .acceptLeeway(1) .acceptExpiresAt(5); Clock clock = new CustomClock(); //Must implement Clock interface JWTVerifier verifier = verification.build(clock);</code></pre> <br /> <strong>6.5解码一个jwt令牌</strong> <pre> <code class="language-java">String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE"; try { DecodedJWT jwt = JWT.decode(token); } catch (JWTDecodeException exception){ //Invalid token }</code></pre> 如果令牌有无效的语法,或者消息头或有效负载不是JSONs,那么将会抛出JWTDecodeException异常。<br /> <br /> <strong>6.6JWT头部解析</strong> <h4><br /> Algorithm ("alg")</h4> 返回jwt的算法值或,如果没有定义则返回null <pre> <code class="language-java">String algorithm = jwt.getAlgorithm();</code></pre> <p> </p> <p>Type ("typ")</p> <p>返回jwt的类型值,如果没有定义则返回null(多数情况类型值为jwt)</p> <pre> <code class="language-java">String type = jwt.getType();</code></pre> <p> </p> <p>Content Type ("cty")</p> <p>返回内容的类型,如果没有定义则返回null</p> <pre> <code class="language-java">String contentType = jwt.getContentType();</code></pre> <p><br /> Key Id ("kid")<br /> 返回key的id值,如果没有定义则返回null<br />  </p> <pre> <code class="language-java">String keyId = jwt.getKeyId();</code></pre> <h4>私有的Claims,即自定义字段</h4> 在令牌的头部中定义的附加声明可以通过调用getHeaderClaim() 获取,即使无法找到,也会返回。您可以通过调用claim.isNull()来检查声明的值是否为null。 <pre> <code class="language-java">Claim claim = jwt.getHeaderClaim("owner");</code></pre> 当使用jwt.create()创建一个令牌时,您可以通过调用withHeader()来指定头声明,并同时传递声明的映射。 <pre> <code class="language-java">Map<String, Object> headerClaims = new HashMap(); headerClaims.put("owner", "auth0"); String token = JWT.create() .withHeader(headerClaims) .sign(algorithm); </code></pre> <em>提示:在签名过程之后,alg和typ值将始终包含在Header中。</em><br /> <br /> <strong>6.7JWT的负载(Payload)声明</strong> <h4>Issuer ("iss")</h4> 返回签发者的名称值,如果没有在负载中定义则返回null <pre> <code class="language-java">String issuer = jwt.getIssuer();</code></pre> <h4>Subject ("sub")</h4> 返回jwt所面向的用户的值,如果没有在负载中定义则返回null <pre> <code class="language-java">String subject = jwt.getSubject();</code></pre> <h4>Audience ("aud")</h4> 返回该jwt由谁接收,如果没有在负载中定义则返回null <pre> <code class="language-java">List<String> audience = jwt.getAudience();</code></pre> <h4>Expiration Time ("exp")</h4> 返回该jwt的过期时间,如果在负载中没有定义则返回null <pre> <code class="language-java">Date expiresAt = jwt.getExpiresAt();</code></pre> <h4>Not Before ("nbf")</h4> Returns the Not Before value or null if it's not defined in the Payload. <pre> <code class="language-java">Date notBefore = jwt.getNotBefore();</code></pre> <h4>Issued At ("iat")</h4> 返回在什么时候签发的,如果在负载中没有定义则返回null <pre> <code class="language-java">Date issuedAt = jwt.getIssuedAt();</code></pre> <h4>JWT ID ("jti")</h4> 返回该jwt的唯一标志,如果在负载中没有定义则返回null <pre> <code class="language-java">String id = jwt.getId();</code></pre> <strong>自定义声明</strong><br /> 在令牌有效负载中定义的附加声明可以通过调用getClaims()或 getClaim()和传递声明名来获得。即使无法找到声明,也将会有返回值。您可以通过调用claim.isNull()来检查声明的值是否为null。 <pre> <code class="language-java">Map<String, Claim> claims = jwt.getClaims(); //Key is the Claim name Claim claim = claims.get("isAdmin");</code></pre> 或者: <pre> <code class="language-java">Claim claim = jwt.getClaim("isAdmin");</code></pre> 当使用jwt.create()创建一个令牌时,您可以通过调用withClaim()来指定自定义声明,并同时传递名称和值。 <pre> <code class="language-java">String token = JWT.create() .withClaim("name", 123) .withArrayClaim("array", new Integer[]{1, 2, 3}) .sign(algorithm);</code></pre> 您还可以通过调用withClaim()来验证jwt.require()的自定义声明,并传递该名称和所需的值。 <pre> <code class="language-java">JWTVerifier verifier = JWT.require(algorithm) .withClaim("name", 123) .withArrayClaim("array", 1, 2, 3) .build(); DecodedJWT jwt = verifier.verify("my.jwt.token");</code></pre> <em>提示:当前支持的自定义JWT声明创建和验证的类型是:Boolean, Integer, Double, String, Date 和Arrays。</em><br /> <br /> <strong>6.8Claim Class</strong><br /> 索赔类是索赔值的包装器。它允许您将索赔作为不同的类类型。可用的工具方法:<br /> 原始的: <ul> <li><strong>asBoolean()</strong>: 返回布尔值,如果不能转换返回null。</li> <li><strong>asInt()</strong>: 返回整数值,如果不能转换返回null。</li> <li><strong>asDouble()</strong>: 返回 Double 值,如果不能转换则返回null。</li> <li><strong>asLong()</strong>: 返回Long 值,如果不能转换则返回null。</li> <li><strong>asString()</strong>: 返回String值,如果不能转换则返回null。</li> <li><strong>asDate()</strong>: 返回 Date值,如果不能转换则返回null。 必须是一个数字日期 (Unix 系统时间戳). 注意,JWT标准指定所有的数字日期值必须以秒为单位。</li> </ul> <h4>自定义类型和集合:</h4> 要获得作为集合的声明,您需要提供要转换的内容的类类型 <ul> <li>as(class): 返回 Class Type 的解析值. 对于集合,您应该使用asArray和asList方法。</li> <li>asMap(): 返回被转换为 Map<String, Object>的值</li> <li>asArray(class): 返回被转换成元素类型的 Class Type, or null if the value isn't a JSON Array.</li> <li>asList(class): 返回集合元素的 Class Type, or null if the value isn't a JSON Array.</li> </ul> <em>如果不能将值转换为给定的类类型,则会抛出JWTDecodeException异常</em><br /> <br /> <em>翻译的不标准的后续更近,欢迎提供宝贵意见或者翻译,联系leftso@qq.com</em>
  • Java 9 模块化编程

    Java 9 模块化编程Java9 模块化编程
  • java编程中正则表达式'并且'的写法

    java编程中正则表达式'并且'的写法java编程中正则表达式'并且'的写法 <pre> <code class="language-java">package com.leftso; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { try { String str1="<a href=\"jjjjkkkkccc\" title='测试'></a><a title='xxx'></a>"; // String reg1="\\s*href\\s*=\\s*['|\"](.*)['|\"]";//字符串中不包含a和d String reg2="\\s*href\\s*=\\s*['|\"]([^('|\"|>)]*)['|\"]";//[^('|\"|>)]代表不是'且不是"且不是> Pattern pattern1=Pattern.compile(reg1); Pattern pattern2=Pattern.compile(reg2); Matcher matcher1=pattern1.matcher(str1); if(matcher1.find()){ System.out.println("不含且关系>>"+matcher1.group(1)); } Matcher matcher2=pattern2.matcher(str1); if(matcher2.find()){ System.out.println("包含且关系>>"+matcher2.group(1)); } } catch (Exception e) { e.printStackTrace(); } } } </code></pre> <br /> 执行结果:<br /> <img alt="执行结果" class="img-thumbnail" src="/resources/assist/images/blog/6cdb040c-f401-40af-a391-32b9ed3363d0.png" /><br /> <span style="color:#FF0000"><strong>多个并且关系就是[^(1|2|3|4|..)]这样达到且的效果,其中1234..表示且的多个条件</strong></span>
  • Java编程之java static关键字

    Java编程之java static关键字,Java编程,static关键字<h2>一、java中static关键字</h2> java中的static关键字可以应用于变量、方法、块、导入和内部类。在本教程中,我们将了解在这些地方使用static关键字的效果。<br /> <br /> 本文将要讲解的内容目录: <ul> <li>Static 变量的使用讲解</li> <li>Static 方法的使用讲解</li> <li>Static 导入声明使用讲解</li> <li>Static 块的使用讲解</li> <li>Static 类的使用讲解</li> <li>static关键字使用总结</li> </ul> <h2>二、static变量</h2> 要声明一个static变量,请在变量声明中使用static关键字。static变量的语法是: <pre> <code>ACCESS_MODIFER static DATA_TYPE VARNAME;</code></pre> 例如,用这种方式声明整数类型的公共静态变量。 <pre> <code class="language-java">public static Integer staticVar;</code></pre> 静态变量最重要的一点是它们属于类级别。这意味着在运行时只能有一个变量的副本。当在类定义中定义静态变量时,类的每个实例都可以访问该单一副本。单独的类实例不会有它们自己的本地副本,就像它们对非静态变量一样。<br /> <br /> 让我们来了解一个例子: <pre> <code class="language-java">public class JavaStaticExample { public static void main(String[] args) { DataObject objOne = new DataObject(); objOne.staticVar = 10; objOne.nonStaticVar = 20; DataObject objTwo = new DataObject(); System.out.println(objTwo.staticVar); //10 System.out.println(objTwo.nonStaticVar); //null DataObject.staticVar = 30; //Direct Access System.out.println(objOne.staticVar); //30 System.out.println(objTwo.staticVar); //30 } } class DataObject { public static Integer staticVar; public Integer nonStaticVar; }</code></pre> <br /> 输出内容: <pre> <code>10 null 30 30</code></pre> 注意我们如何将值更改为30,并且这两个对象现在看到的更新值为30。<br /> <br /> 另一件您应该注意到的是,我们如何能够使用它的类名来访问静态变量,即dataobject . staticvar。我们不需要创建任何实例来访问静态变量。它清楚地表明静态变量属于类范围。 <h2>三、static方法</h2> 要声明静态方法,请在方法声明中使用静态关键字。静态方法的语法是: <pre> <code>ACCESS_MODIFER static RETURN_TYPE METHOD_NAME;</code></pre> <br /> 例如,用这种方式声明整数类型的公共静态变量。 <pre> <code class="language-java">public static Integer getStaticVar(){ return staticVar; }</code></pre> <p>要记住的一些事项。</p> <ol> <li>您只能在静态方法中访问静态变量。如果您尝试访问任何非静态变量,将生成的编译器错误信息“无法对非静态字段非静态变量进行静态引用”。</li> <li>静态方法可以通过它的类引用来访问,并且不需要创建类的实例。虽然您也可以使用实例引用,但是与通过类引用的访问相比,它不会有任何不同。</li> <li>静态方法也属于类级范围。</li> </ol>   <pre> <code class="language-java">public class JavaStaticExample { public static void main(String[] args) { DataObject.staticVar = 30; //Direct Access Integer value1 = DataObject.getStaticVar(); //access with class reference DataObject objOne = new DataObject(); Integer value2 = objOne.getStaticVar(); //access with instance reference System.out.println(value1); System.out.println(value2); } } class DataObject { public Integer nonStaticVar; public static Integer staticVar; //static variable public static Integer getStaticVar(){ return staticVar; } }</code></pre> 输出内容: <pre> <code>30 30</code></pre> <h2>四、static Import 声明</h2> <p>    正常的导入声明从包中导入类,因此它们可以在没有包引用的情况下使用。类似地,静态导入声明从类中导入静态成员,并允许它们在没有类引用的情况下使用。</p> <p>    静态导入声明也有两种类型:单静态导入和静态导入。单静态导入声明从类型中导入一个静态成员。静态输入-点播声明导入了类型的所有静态成员。<br />  </p> <pre> <code class="language-java">//Single-static-import declaration: import static <<package name>>.<<type name>>.<<static member name>>; //Static-import-on-demand declaration: import static <<package name>>.<<type name>>.*;</code></pre> 例如, <code>System.out</code> is <pre> <code class="language-java">//Static import statement import static java.lang.System.out; public class JavaStaticExample { public static void main(String[] args) { DataObject.staticVar = 30; out.println(DataObject.staticVar); //Static import statement example } } class DataObject { public static Integer staticVar; //static variable }</code></pre> 输出: <pre> <code>30</code></pre> <h2>五、Static 块</h2> 静态块是类初始化代码的一部分,它用静态关键字包装。一般的语法是: <pre> <code class="language-java">static { //initialize static members of class }</code></pre> 当类装入内存时,将执行静态块。一个类可以有多个静态块,并且它们将以相同的顺序执行,它们在类定义中出现。 <pre> <code class="language-java">import static java.lang.System.out; class DataObject { public Integer nonStaticVar; public static Integer staticVar; //static variable //It will be executed first static { staticVar = 40; //nonStaticVar = 20; //Not possible to access non-static members } //It will be executed second static { out.println(staticVar); } }</code></pre> 输出: <pre> <code>40</code></pre> <h2>六、static 类</h2> 在java中,可以将静态类作为内部类。与其他静态成员一样,嵌套的类属于类范围,所以可以访问内部的静态类,而不具有外部类的对象。 <pre> <code class="language-java">public class JavaStaticExample { public static void main(String[] args) { //Static inner class example System.out.println( DataObject.StaticInnerClas.innerStaticVar ); } } class DataObject { public Integer nonStaticVar; public static Integer staticVar; //static variable static class StaticInnerClas { Integer innerNonStaticVar = 60; static Integer innerStaticVar = 70; //static variable inside inner class } }</code></pre> 请注意,静态内部类无法访问外部类的非静态成员。它只能访问来自外部类的静态成员。 <pre> <code class="language-java">public class JavaStaticExample { public static void main(String[] args) { //Static inner class example DataObject.StaticInnerClas.accessOuterClass(); } } class DataObject { public Integer nonStaticVar; public static Integer staticVar; //static variable static { staticVar = 40; //nonStaticVar = 20; //Not possible to access non-static members } public static Integer getStaticVar(){ return staticVar; } static class StaticInnerClas { public static void accessOuterClass() { System.out.println(DataObject.staticVar); //static variable of outer class System.out.println(DataObject.getStaticVar()); //static method of outer class } } }</code></pre> 输出: <pre> <code>40</code></pre> <h2>七、总结</h2> 让我们总结一下java中静态使用的所有内容。 <ol> <li>静态成员属于类。不需要创建类实例来访问静态成员。</li> <li>静态成员(变量和方法)只能在静态方法和静态块中访问。</li> <li>不能在静态方法、块和内部类中访问非静态成员。</li> <li>一个类可以有多个静态块,它们将按照类定义的顺序执行。</li> <li>只有当类声明为内部类内部类时,类才能是静态的。</li> <li>静态导入可用于从类导入所有的静态成员。这些成员可以被引用,没有任何类引用。</li> </ol>
  • Java编程纯jdk java编写webservice服务和客服端

    Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)<br /> <br /> 1.server<br /> <br /> 编写一个简单的server接口 <pre> <code class="language-java">package com.leftso.ws; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface CommService { // 使用@WebMethod注解标注WebServiceI接口中的方法 @WebMethod String sayHello(String name); } </code></pre> <br /> 编写接口实现: <pre> <code class="language-java">package com.leftso.ws; import javax.jws.WebService; /** * 使用@WebService注解标注WebServiceI接口的实现类WebServiceImpl * * @author leftso * */ @WebService public class CommServiceImp implements CommService { @Override public String sayHello(String name) { return "Hello ," + name; } } </code></pre> <br /> 将该接口以webservice方式发布出去: <pre> <code class="language-java">package com.leftso.ws; import javax.xml.ws.Endpoint; public class WebServicePublish { public static void main(String[] args) { // 定义WebService的发布地址,这个地址就是提供给外界访问Webervice的URL地址,URL地址格式为:http://ip:端口号/xxxx // String address = "http://192.168.1.100:8989/";这个WebService发布地址的写法是合法的 // String address = // "http://192.168.1.100:8989/Webservice";这个WebService发布地址的是合法的 String address = "http://127.0.0.1:9000/WS_Server/Webservice"; // 使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用 Endpoint.publish(address, new CommServiceImp()); System.out.println("发布webservice成功!"); System.out.println("请使用:"+address+"?wsdl 访问"); } } </code></pre> <br /> 运行main方法,访问地址http://127.0.0.1:9000/WS_Server/Webservice?wsdl<br /> 可以看见wsdl文档如下<br /> <img alt="wsdl" class="img-thumbnail" src="/resources/assist/images/blog/f26343d873c54ffd93e74e4b14952f0f.png" /><br /> 2.client<br /> 调用,可以用最简单的jdk自带的工具wsimport生成本地Java代码,以类的方式直接调用方法就行 <pre> <code>wsimport -keep url_wsdl(自己的wsdl地址)</code></pre> <br />  
  • java编程中float/double类型保留2位/n位小数

    java编程中float或double类型保留2位/n位小数使用BigDecimal进行处理java编程中float或double类型保留2位/n位小数使用BigDecimal进行处理<br /> <br /> Java编程代码如下: <pre> <code class="language-java">package com.leftso.common; import java.math.BigDecimal; public class NumberUtils { public static void main(String[] args) { float f1 = 10.236f; float f2 = 10.22f; double d1 = 0.239; double d2 = 10.33; System.out.println("float两位:" + floatScale(2, f1)); System.out.println("float一位:" + floatScale(1, f2)); System.out.println("double两位:" + doubleScale(2, d1)); System.out.println("double一位:" + doubleScale(1, d2)); } /** * float类型保留n位小数处理 * * @param len * 小数位数长度 * @param number * 值 * @return 返回值 */ public static float floatScale(int len, float number) { BigDecimal bigDecimal = new BigDecimal(number); return bigDecimal.setScale(len, BigDecimal.ROUND_HALF_UP).floatValue(); } /** * double类型保留n位小数处理 * * @param len * 小数位数长度 * @param number * 值 * @return 返回值 */ public static double doubleScale(int len, double number) { BigDecimal bigDecimal = new BigDecimal(number); return bigDecimal.setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue(); } } </code></pre> <img alt="运行实例" class="img-thumbnail" src="/resources/assist/images/blog/75a90e30-4f46-41c3-90a3-601acbb1e69e.png" />
  • Java编程之Map与Java bean之间的转换工具类

    Map与Java bean之间的转换工具类,用于java.util.Map与普通javabean直接的相互转换,Java编程Java编程之Map与Java bean之间的转换工具类,用于java.util.Map与普通javabean直接的相互转换<br /> 工具代码清单:<br /> MapUtils.java: <pre> <code class="language-java">import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class MapUtils { /** * javaBean 转 Map * * @param object * 需要转换的javabean * @return 转换结果map * @throws Exception */ public static Map<String, Object> beanToMap(Object object) throws Exception { Map<String, Object> map = new HashMap<String, Object>(); @SuppressWarnings("rawtypes") Class cls = object.getClass(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); map.put(field.getName(), field.get(object)); } return map; } /** * * @param map * 需要转换的map * @param cls * 目标javaBean的类对象 * @return 目标类object * @throws Exception */ public static Object mapToBean(Map<String, Object> map, @SuppressWarnings("rawtypes") Class cls) throws Exception { Object object = cls.newInstance(); for (String key : map.keySet()) { Field temFiels = cls.getDeclaredField(key); temFiels.setAccessible(true); temFiels.set(object, map.get(key)); } return object; } } </code></pre> <br /> 利用了Java语言的反射机制