Hello Coder


  • 首页

  • 归档

  • 标签

  • 搜索
close

String

发表于 2016-08-03

OpenJDK 源代码阅读之 String


概要

  • 类继承关系
1
2
java.lang.Object
java.lang.String
  • 定义
1
2
3
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
  • 要点

一旦创建就不可改变

阅读全文 »

JAVA NIO Demo

发表于 2016-08-02

JAVA NIO Demo


Nio 服务端

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package com.zsr.test.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
/**
* nio 服务端 Created by david.zhang
*/
public class NIOServer {
// 通道管理器
private Selector selector;
/**
* 获得一个ServerSocket通道,并对该通道做一些初始化的工作
*
* @param port 绑定的端口号
* @throws IOException
*/
public void initServer(int port) throws IOException {
// 获得一个ServerSocket通道
ServerSocketChannel serverChannel = ServerSocketChannel.open();
// 设置通道为非阻塞
serverChannel.configureBlocking(false);
// 将该通道对应的ServerSocket绑定到指定端口
serverChannel.socket().bind(new InetSocketAddress(port));
// 获得一个通道管理器
this.selector = Selector.open();
// 将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后,
// 当该事件到达时,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞。
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
/**
* 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理
*
* @throws IOException
*/
public void listen() throws IOException {
System.out.println("nio server listen start.");
// 轮询访问selector
while (true) {
// 当注册的事件到达时,方法返回;否则,该方法会一直阻塞
selector.select();
// 获得selector中选中的项的迭代器,选中的项为注册的事件
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
// 删除已选的key,以防重复处理
it.remove();
// 客户端请求连接事件
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
// 获得和客户端连接的通道
SocketChannel channel = server.accept();
// 设置成非阻塞
channel.configureBlocking(false);
// 在这里可以给客户端发送信息
channel.write(ByteBuffer.wrap(new String("服务器收到客户端连接请求.").getBytes()));
// 在和客户端连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限。
channel.register(selector, SelectionKey.OP_READ);
// 获得了可读事件
} else if (key.isReadable()) {
read(key);
}
}
}
}
/**
* 处理读取客户端发来的信息 的事件
*
* @param key
* @throws IOException
*/
public void read(SelectionKey key) throws IOException {
// 服务器可读取消息:得到事件发生的Socket通道
SocketChannel channel = (SocketChannel) key.channel();
// 创建读取的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
byte[] data = buffer.array();
String msg = new String(data);
System.out.println("服务器端收到客户端信息:" + msg);
// 将消息回送给客户端
ByteBuffer outBuffer = ByteBuffer.wrap(new String("服务器端发送客户端消息: world.").getBytes());
channel.write(outBuffer);
}
// 服务器端测试
public static void main(String[] args) throws IOException {
NIOServer nioServer = new NIOServer();
nioServer.initServer(8000);
nioServer.listen();
}
}
阅读全文 »

MapReducer

发表于 2016-08-02

MapReducer笔记

参入mapreduce作业执行涉及4个独立的实体:

  • 客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;

  • JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;

  • TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个

  • Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面

阅读全文 »

Java动态代理

发表于 2016-08-01

Java动态代理


Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习。Spring AOP使用了两种代理机制:一种是基于JDK的动态代理;另一种是基于CGLib的动态代理。之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理。
带有横切逻辑的实例

我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造。在调用每一个目标类方法时启动方法的性能监视,在目标类方法调用完成时记录方法的花费时间。

代码清单6-2 ForumService:包含性能监视横切代码

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
package com.baobaotao.proxy;
public class ForumServiceImpl implements ForumService {
public void removeTopic(int topicId) {
//①-1开始对该方法进行性能监视
PerformanceMonitor.begin(
"com.baobaotao.proxy.ForumServiceImpl. removeTopic");
System.out.println("模拟删除Topic记录:"+topicId);
try {
Thread.currentThread().sleep(20);
} catch (Exception e) {
throw new RuntimeException(e);
}
//①-2结束对该方法进行性能监视
PerformanceMonitor.end();
}
public void removeForum(int forumId) {
//②-1开始对该方法进行性能监视
PerformanceMonitor.begin(
"com.baobaotao.proxy.ForumServiceImpl. removeForum");
System.out.println("模拟删除Forum记录:"+forumId);
try {
Thread.currentThread().sleep(40);
} catch (Exception e) {
throw new RuntimeException(e);
}
//②-2结束对该方法进行性能监视
PerformanceMonitor.end();
}
}

代码清单6-2中粗体表示的代码就是具有横切逻辑特征的代码,每个Service类和每个业务方法体的前后都执行相同的代码逻辑:方法调用前启动PerformanceMonitor,方法调用后通知PerformanceMonitor结束性能监视并给记录性能监视结果。

阅读全文 »

Java反射

发表于 2016-08-01

Java反射


Java语言允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数、属性和方法等。Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,这就为使用程序化方式操作Class对象开辟了途径。

简单实例

我们将从一个简单例子开始探访Java反射机制的征程,下面的Car类拥有两个构造函数、两个方法以及三个属性,如代码清单3-9所示:

代码清单3-9 Car

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.baobaotao.reflect;
public class Car {
private String brand;
private String color;
private int maxSpeed;
//①默认构造函数
public Car(){}
//②带参构造函数
public Car(String brand,String color,int maxSpeed){
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
}
//③未带参的方法
public void introduce() {
System.out.println("brand:"+brand+";color:"+color+";maxSpeed:" +maxSpeed);
}
//省略参数的getter/Setter方法
…
}

一般情况下,我们会使用如下的代码创建Car的实例:

1
2
Car car = new Car();
car.setBrand("红旗CA72");

或者:

1
Car car = new Car("红旗CA72","黑色");

以上两种方法都采用传统方式的直接调用目标类的方法,下面我们通过Java反射机制以一种更加通用的方式间接地操作目标类:

阅读全文 »
1…293031
David

David

Develop Notes

155 日志
37 标签
GitHub Weibo
© 2016 - 2020 David
由 Hexo 强力驱动
主题 - NexT.Pisces