设计模式之装饰器模式
设计模式之装饰者模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
- 装饰者模式介绍?
- 装饰者模式的实现?
- 举例?
设计模式之观察者模式
设计模式之观察者模式
本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式—观察者模式。
- 什么是观察者模式?
- 模式的结构?
- 模式自定义实现和JDK自带实现?
- 推模型和拉模型?
- JDK源码分析?
Java 生成Zxing二维码
java 利用Zxing 生成二维码(不带Logo)
Zxing是Google提供的关于条码(一维码、二维码)的解析工具,提供了二维码的生成与解析的方法,现在我简单介绍一下使用Java利用Zxing生成与解析二维码
1、二维码生成
1 | import com.google.zxing.common.BitMatrix; |
然后测试类生成一个二维码:
1 | try { |
这样就生成了一个二维码,还是挺简单的,使用可以扫描的工具;因为内容是一个链接所以也没可能会跳转到这个链接。**
2、解析二维码
1 | BufferedImageLuminanceSource |
测试:
public static void main(String[] args) throws IOException, NotFoundException {
MultiFormatReader formatReader = new MultiFormatReader();
String filePath = "C:/Users/Administrator/Desktop/testImage";
File file = new File(filePath);
BufferedImage image = ImageIO.read(file);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
Result result = formatReader.decode(binaryBitmap,hints);
System.out.println("result = "+ result.toString());
System.out.println("resultFormat = "+ result.getBarcodeFormat());
System.out.println("resultText = "+ result.getText());
}
下面会给出生成logo的二维码代码工具.
Java 生成Zxing二维码(带Logo)
java 利用Zxing 生成二维码(带Logo)
Zxing是Google提供的关于条码(一维码、二维码)的解析工具,提供了二维码的生成与解析的方法,现在我简单介绍一下使用Java利用Zxing生成与解析二维码
Java类加载器
自定义ClaaLoader加载类文件
类加载器是JVM执行类加载机制的前提,其主要任务为根据一个类的全限定名来读取此类的二进制字节流到JVM内部,然后转换为一个与目标类对应的java.lang.Class对象实例
- defineClass();
defineClass方法 的主要作用是将byte 字节流解析成JVM能够识别的class对象,这个方法意味着 我们不仅仅可以通过class文件去实例化对象,还可以其他方式实例化对象,例如我们通过网络接收到一个类的字节码;defineClass的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38protected final Class<?> defineClass(String name, byte[] b, int off, int len,
ProtectionDomain protectionDomain)
throws ClassFormatError
{
protectionDomain = preDefineClass(name, protectionDomain);
String source = defineClassSourceLocation(protectionDomain);
Class<?> c = defineClass1(name, b, off, len, protectionDomain, source);
postDefineClass(c, protectionDomain);
return c;
}
protected final Class<?> defineClass(String name, java.nio.ByteBuffer b,
ProtectionDomain protectionDomain)
throws ClassFormatError
{
int len = b.remaining();
// Use byte[] if not a direct ByteBufer:
if (!b.isDirect()) {
if (b.hasArray()) {
return defineClass(name, b.array(),
b.position() + b.arrayOffset(), len,
protectionDomain);
} else {
// no array, or read-only array
byte[] tb = new byte[len];
b.get(tb); // get bytes out of byte buffer.
return defineClass(name, tb, 0, len, protectionDomain);
}
}
protectionDomain = preDefineClass(name, protectionDomain);
String source = defineClassSourceLocation(protectionDomain);
Class<?> c = defineClass2(name, b, b.position(), len, protectionDomain, source);
postDefineClass(c, protectionDomain);
return c;
}
findClass();
实现类的加载规则,取得要加载类的字节码,通常是和defineClass()一起使用的;查找类,返回java.lang.Class类的实例loadClass();
加载类,返回java.lang.Class类的实例resolveClass();
连接指定的一个类,如果你想在类被加载到JVM中的时候就被链接(Link),则调用resolveClass()方法;
1 | package com.test; |
执行结果:
1 | AssessmentAgencies |
Linux自动发布Tomcat项目脚本
Shell 脚本之自动发布Tomcat项目
鉴于每次测试让发布测试环境的项目,都是手动一系列的操作:连接SSH、CD、RM -RF ../项目、PS -EF|GREP TOMCAT-WEB等繁琐的操作实在蛋疼,后来就想直接自己把这个命令写好放在.sh文件中,手动运行不就行了。
1、Web服务器Linux环境搭建(Tomcat)
2、Shell脚本编写
3、测试
1、Web服务器Linux环境搭建(Tomcat)
1.1、JDK环境配置
Java开发的程序猿们都知道,现在的互联网公司生产环境大多都是Linux服务器,并且用的比较多的大都是CentOS,Red hat系列的Linux系统环境,下面我就以我当前安装的CentOS 7.3来说明一下在该环境下安装Jdk 1.8.1_62版本的操作过程吧,如下所述:
一:首先下载对应CentOS版本的jdk:jdk-8u162-linux-x64.tar.gz ,下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html。
二:下载该jdk到本地,并上传到你的CentOS系统的opt临时目录下。
三:在安装自己下载的jdk之前,要先看看新安装的CentOS 7.0系统自带的jdk版本,如果存在最好是卸载掉,然后再安装自己下载的jdk版本,如何卸载linux系统自带的jdk网上有很多例子,相信大家都会操作。
四:新建一个jdk的安装目录,我这里是在/usr/local/下新建了java目录,命令:
1 | mkdir /usr/local/java |
再把 jdk-8u162-linux-x64.tar.gz压缩包从opt目录下复制到/usr/local/java目录下,命令如下:
1 | cp jdk-7u75-linux-x64.tar.gz /usr/local/java |
五:解压缩刚才下载的: jdk-8u162-linux-x64.tar.gz包,命令如下:
1 | tar xvf jdk-8u162-linux-x64.tar.gz |
六:解压完成后,开始编辑环境变量进入到:
1 | [root@localhost~]# cd /etc |
在profile文件的末尾加入如下命令:
1 | export JAVA_HOME=/usr/local/java/jdk1.8.1_62 |
输入:wq保存并退出,然后再重启CentOS 6.4系统
七:重新启动系统后,输入:java -version,如果看到输出JDK的版本信息就说明你的jdk已经安装成功了。
1.2、SVN 安装
如果使用的是GNU/Linux基于RPM,然后使用yum命令进行安装。安装成功后,执行的svn - version命令。
1 | [root@localhost ~]# yum install subversion |
如果使用的是基于Debian GNU/Linux的命令进行安装然后用apt:
1 | [root@localhost]$ sudo apt-get install subversion |
1.3、Maven 安装
1.首先到Maven官网下载安装文件,目前最新版本为3.5.3,下载文件为apache-maven-3.5.3-bin.tar.gz,下载可以使用wget命令。
2.进入下载文件夹,找到下载的文件,运行如下命令解压:
1 | tar -xvf apache-maven-3.5.3-bin.tar.gz |
解压后的文件夹名为apache-maven-3.5.3。
3.使用mv命令将apache-maven-3.5.3文件夹拷贝到自己指定的文件夹,比如/usr/local/下
1 | mv -rf apache-maven-3.0.3 /usr/local/ |
4.配置环境变量,编辑/etc/profile文件,添加如下代码
1 | MAVEN_HOME=/usr/local/apache-maven-3.0.3 |
5.保存文件,并运行如下命令使环境变量生效
1 | source /etc/profile |
6.在控制台输入如下命令,如果能看到Maven相关版本信息,则说明Maven已经安装成功
1 | mvn -v |
2、Shell 脚本编写
脚本路径:/java_tool/deployerTool.sh
启动带参数(参数是重新发布的哪个系统。这里举例gov,shcool)
1 | #!/bin/bash |
3、测试
执行/java_tool/publish.sh gov 如果终端输出部署打印的日志文件说明成功。
Java并发之Synchronized
Java并发编程系列之synchronized
接上一篇《Java并发之volatile》,这是第二篇,说的是关于并发编程的synchronized元素。
- synchronized使用方法
- synchronized 实现原理
- 锁优化
- 总结
Java并发之Volatitle
Java 并发之Volatile
上一篇简单的了解了Java中的常用阻塞队列,今天来讲讲Java中经常使用到的另一个比较难懂的关键字Volatile,这个关键字之所以难懂,是因为他在Java字节码层面做了些动作。今天就来看看。
再讲Volatile之前,这里先让大家了解下Java 应该容易搞混淆的两个概念,之前笔者也没有弄清楚也是后面查资料,这里也一并提出来。
- Java内存模型(JMM)
- Jvm内存模型
- Volatile语义
- 使用场景
- 原理浅析
- 总结