java

Java enum用法详解

自古美人都是妖i 提交于 2021-02-20 08:58:47
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二: switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。 = === 用法三:向枚举中添加新方法 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。 "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4 Color(String name, .name =.index = String getName( (c.getIndex() == .name = setIndex(.index = 用法四:覆盖枚举的方法 下面给出一个toString()方法覆盖的例子。 "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4 Color(String name, .name =.index = .index + "_" + 用法五:实现接口

Spring | Bean 的生命周期

谁说胖子不能爱 提交于 2021-02-20 08:37:27
作者:sunshujie1990 www.jianshu.com/p/1dec08d290c1 S pring Bean的生命周期是Spring面试热点问题。 这个问题即考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易! 本文希望能够从源码角度入手,帮助面试者彻底搞定Spring Bean的生命周期。 只有四个! 是的,Spring Bean的生命周期只有这四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Spring的生命周期,首先要把这四个阶段牢牢记住。实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。在这四步之间穿插的各种扩展点,稍后会讲。 实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction 实例化 -> 属性赋值 -> 初始化 -> 销毁 主要逻辑都在doCreate()方法中,逻辑很清晰,就是顺序调用以下三个方法,这三个方法与三个生命周期阶段一一对应,非常重要,在后续扩展接口分析中也会涉及。 createBeanInstance() -> 实例化 populateBean() -> 属性赋值 initializeBean() -> 初始化 源码如下,能证明实例化

第一个java程序:Hello World!

拜拜、爱过 提交于 2021-02-20 08:37:10
1. 新建一个名为 HelloWorld的txt文件,内容为: 1 public class HelloWorld { 2 public static void main(String[] args) { 3 System.out.println("Hello World!" ); 4 } 5 } Hello World 2. 将文件后缀名改为.java: 3. Windows + R 打开cmd:进入文件所在的目录   3.1》执行命令:javac HelloWorld.java(此时会生成一个HelloWorld.class文件)   3.2》执行命令:java HelloWorld(Hello World!被输出) 备注: a> javac命令和java命令来自于jdk安装路径的bin目录里 b> javac命令将java源文件转译成java字节码文件(.class文件) c> java命令运行.class文件 HelloWorld 细节 1. main的方法:Java应用程序的执行入口是main()方法 2. 一个 Java 源文件中最多只能有一个 public 类。其它类的个数不限,如果源文件文件包含一个 public 类,它必须是该类名命名 3. Java 语言严格区分大小写 4. Java方法由一条条语句构成,每个语句以分号结束 注释 注释:用于解释说明程序的文字

How to get the logger wrapped in slf4j?

六眼飞鱼酱① 提交于 2021-02-20 08:32:13
问题 Is it possible to get the logger wrapped by slf4j ? For example, in debug mode, when I inspect org.slf4j.LoggerFactory.getLogger(loggerName) , I can see the logger (here, java.util.logging ) : I want to do something like : // Get the real logger, cast in java.util.logging java.util.logging.Logger myLogger = LoggerFactory.getLogger(loggerName))...; // Use the java.util.logging methods myLogger.setLevel(Level.parse(level)); 回答1: I've found a solution using reflection. Looking for the "logger"

Jenkins 安装、配置与项目新建及构建

给你一囗甜甜゛ 提交于 2021-02-20 08:27:13
1、Jenkins的安装与配置 1.1 java环境配置 Jenkins基于Java, Linux下安装java只要配置java环境变量即可。 首先,解压java到相应目录,我一般习惯把安装的软件放到目录/usr/local下。 tar -zxvf jdk-6u45-linux-x64.tar.gz /usr/local 编辑环境变量,在/etc/profile文件中添加环境变量,Linux的所有用户都可以使用。 vim /etc/profile 在文件最后添加内容如下: export JAVA_HOME=/usr/local/jdk1.6.0_45 export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart 这样,java就配置完成 1.2 安装Jenkins 简单来说需要下面四步: wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins

tomcat SSL

随声附和 提交于 2021-02-20 08:24:30
在网络上 , 信息在传递过程中会经过其他计算机 . 一般情况下它不会监听信息内容 . 但在网上使用网上银行或等交易的时候可能被监视 , 从而导致信息泄露 . 这时候就要应用 SSL; SSL 是一种保证在网络上的两个节点之间进行安全通信的机制 . 它可以用来建立安全的连接 . 网络通信协议如 HTTP,IMAP 都可以采用 SSL. 采用了 SSL 的 HTTP 协议叫 :HTTPS.HTTP 默认端口是 80;HTTPS 端口是 443. 网上购物时 , 安全隐患主要有两种 : 1. 客户的银行卡等信息被别人截获 . 2. 客户访问的是非法站点 , 专门从事诈骗活动 . SSL 使用加密技术实现会话对方信息的安全传递 , 可以实现信息传递的保密性和完整性 , 并且会话双方能够鉴别对方的身份 . 加密通信 Web 之间的通信可以被监视 ,SSL 使用加密对双方的信息进行加密 . 所以就算被截获了 , 它没有密钥也无法解密 . 多数浏览器支持 40 位或 128 位的加密或两者都支持 , 而服务器只有在安装了安全证书后才可以加密通信 . 安全证书 除了对信息加密 .SSL 还采用身份认证机制 . 确保通信双方都可以验证双方的真实身份 . 它和现实中的身份证类似 . 身份证由国家权威机构颁布发 , 且不允许伪造 . SSL 通过安全证书来证明 WEB 客户或 WEB 服务器的身份 .

Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?

Deadly 提交于 2021-02-20 08:08:02
最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做。 然后我只能找谷歌了,翻译后,我把自己理解外加总结的放在下面。 第一 常量类应该是final,不变的,而接口里的参数是final,也是不变的。 那么,看起来接口是放常量没有一定问题,还省去了final的输入,非常的合适。 但是,类是只能单继承的,接口是允许多实现的。 要是类实现的多个接口出现重名的常量,会报错,必须要在实现类明确常量用的是哪个接口的。 虽然这可以说是架构师设计的问题,但是,架构师这么做就违反了依赖倒转原则,这玩意就不细说了。 第二 如果某个实现了常量接口的类被修改不再需要常量了,也会因为序列化兼容原因不得不保持该实现,而且非final类实现常量接口会导致所有子类被污染。 这个应该很少人遇到过,不过这是 Effective Java 里面说的。 具体的理解就是,能被序列化的一定是数据, 那么突然改了数据结构,可能导致老版的数据无法被反序列化,而新版的数据会有冗杂的数据, 要是折腾个几次,网络传输协议 这个无法通过时间或者空间提升的玩意就能逼死你了。 Effective Java 作者 大佬的原话 According to Joshua Bloch, author of "Effective

Kafka生产消费API JAVA实现

霸气de小男生 提交于 2021-02-20 08:02:53
Maven依赖: <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.0.0</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11</artifactId> <version>0.10.0.0</version> </dependency> Kafka生产者简单接口JAVA实现: import org.apache.kafka.clients.producer.*; import java.util.Properties; public class KafkaProducer { public static void main(String[] args) throws Exception{ String topic = ""; String brokerList = ""; String message = ""; Properties props = new Properties(); props.put("bootstrap.servers", brokerList); props.put(

发送短信验证码

僤鯓⒐⒋嵵緔 提交于 2021-02-20 08:01:52
package com.example.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; public class PostUtil { /** * 向指定URL发送POST方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,请求参数应该是name1=value1&name2=value2的形式。 * @return URL所代表远程资源的响应 */ public static String sendPost(String url, String param) { PrintWriter out = null ; BufferedReader in = null ; String result = "" ; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性

ByteBuffer and Byte Array

血红的双手。 提交于 2021-02-20 07:43:59
问题 Problem I need to convert two ints and a string of variable length to bytes. What I did I converted each data type into a byte array and then added them into a byte buffer. Of which right after that I will copy that buffer to one byte array, as shown below. byte[] nameByteArray = cityName.getBytes(); byte[] xByteArray = ByteBuffer.allocate(4).putInt(x).array(); byte[] yByteArray = ByteBuffer.allocate(4).putInt(y).array(); ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length +