Repository: CrowHawk/JavaLearning
Branch: master
Commit: 7bda9004a34a
Files: 52
Total size: 90.4 KB
Directory structure:
gitextract_55l6bb7f/
├── .idea/
│ ├── .name
│ ├── compiler.xml
│ ├── copyright/
│ │ └── profiles_settings.xml
│ ├── encodings.xml
│ ├── misc.xml
│ ├── modules.xml
│ ├── uiDesigner.xml
│ ├── vcs.xml
│ └── workspace.xml
├── BasicJava.iml
├── Enumeration/
│ ├── Enumeration.iml
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── crow/
│ ├── EnumCoin.java
│ └── EnumTest.java
├── Generic/
│ ├── Generic.iml
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── crow/
│ └── GenericTest.java
├── JNAPointer/
│ ├── .Readme.txt.swp
│ ├── JNAPointer.java
│ ├── README.md
│ ├── callback.cpp
│ ├── cppCompile.sh
│ ├── javarun.sh
│ ├── jna-4.2.1.jar
│ └── swap.cpp
├── NIO/
│ ├── NIO.iml
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── crow/
│ ├── CopyFile.java
│ ├── CreateArrayBuffer.java
│ ├── CreateBuffer.java
│ ├── MultiPortEcho.java
│ ├── ReadAndShow.java
│ ├── ScatterGather.java
│ ├── SliceBuffer.java
│ ├── TypesInByteBuffer.java
│ ├── UseCharsets.java
│ ├── UseFileLocks.java
│ ├── UseFloatBuffer.java
│ ├── UseMappedFile.java
│ └── WriteSomeBytes.java
├── Proxy/
│ ├── Proxy.iml
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── crow/
│ ├── Advice.java
│ ├── ImpAdvice.java
│ └── ProxyTest.java
├── README.md
├── ReadAndShow.txt
├── Reflect/
│ ├── Reflect.iml
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── crow/
│ ├── FieldReflect.java
│ └── ReflectTest.java
└── pom.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .idea/.name
================================================
JavaLearning
================================================
FILE: .idea/compiler.xml
================================================
================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
================================================
FILE: .idea/encodings.xml
================================================
================================================
FILE: .idea/misc.xml
================================================
================================================
FILE: .idea/modules.xml
================================================
================================================
FILE: .idea/uiDesigner.xml
================================================
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
================================================
FILE: .idea/vcs.xml
================================================
================================================
FILE: .idea/workspace.xml
================================================
com.crow.*
1486393746329
1486393746329
1487217889886
1487217889886
1487234520435
1487234520435
1487234799472
1487234799472
1487592431820
1487592431820
No facets are configured
scala-sdk-2.11.7
1.8
jdk5-new
================================================
FILE: BasicJava.iml
================================================
================================================
FILE: Enumeration/Enumeration.iml
================================================
================================================
FILE: Enumeration/pom.xml
================================================
Basic-Java
com.crow
1.0-SNAPSHOT
4.0.0
Enumeration
jar
Enumeration
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
================================================
FILE: Enumeration/src/main/java/com/crow/EnumCoin.java
================================================
package com.crow;
/**
* Created by CrowHawk on 17/2/12.
*/
public abstract class EnumCoin {//Implement an Enum with a common class
private int tag;
private EnumCoin(int tag){
this.tag = tag;
}
public static final EnumCoin OBCERSE = new EnumCoin(1){//an object of an inner class extending EnumCoin
public EnumCoin enumNext(){
return BACK;
}
};
public static final EnumCoin BACK = new EnumCoin(0){
public EnumCoin enumNext(){
return OBCERSE;
}
};
public String toString(){
return this == OBCERSE?"Obcerse":"Back";
}
/* public EnumCoin enumNext(){
if(this == OBCERSE){
return BACK;
}
else{
return OBCERSE;
}
}*/
public abstract EnumCoin enumNext();
}
================================================
FILE: Enumeration/src/main/java/com/crow/EnumTest.java
================================================
package com.crow;
/**
* Created by CrowHawk on 17/2/12.
*/
public class EnumTest {
public static void main(String[] args) {
EnumCoin obcerse = EnumCoin.OBCERSE;
System.out.println("The other side of the Obcerse is " + obcerse.enumNext().toString());
}
}
================================================
FILE: Generic/Generic.iml
================================================
================================================
FILE: Generic/pom.xml
================================================
Basic-Java
com.crow
1.0-SNAPSHOT
4.0.0
Generic
jar
Generic
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
================================================
FILE: Generic/src/main/java/com/crow/GenericTest.java
================================================
package com.crow;
/**
* Created by CrowHawk on 17/2/16.
*/
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class GenericTest {
public static void main(String[] args) throws Exception{
HashMap hashMap = new HashMap();
hashMap.put("Tom", 1);
hashMap.put("Jerry", 2);
hashMap.put("Nick", 3);
printHashmap(hashMap);
String[] array = new String[]{"crow","martin","pattie"};
swap(array, 1, 2);
System.out.println("array[2] = " + array[2]);
//用反射的方法获取printHashmap方法的参数并打印
Method printMethod = GenericTest.class.getMethod("printHashmap", HashMap.class);
Type[] types = printMethod.getGenericParameterTypes();
ParameterizedType parameterizedType = (ParameterizedType)types[0];
Type[] actualTypes = parameterizedType.getActualTypeArguments();
System.out.println("The paratype is " + parameterizedType.getRawType() + "<" + actualTypes[0] + "," + actualTypes[1] + ">");
}
public static void printHashmap(HashMap hashMap){//遍历HashMap并打印其内容
Set> entrySet = hashMap.entrySet();
for(Map.Entry entry: entrySet){
System.out.println(entry.getKey() + "," + entry.getValue());
}
Iterator> iter = entrySet.iterator();
while(iter.hasNext()){
Map.Entry entry = iter.next();
System.out.print("Key is " + entry.getKey() + ",");
System.out.println("Value is " + entry.getValue());
}
}
public static void swap(T[] arr, int i, int j){//交换泛型数组中的任意两个元素
T tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
================================================
FILE: JNAPointer/JNAPointer.java
================================================
import com.sun.jna.*;
import com.sun.jna.ptr.*;
public class JNAPointer {
/**
* @param args
*/
public interface CLib extends Library{
public interface OpenFunc extends Callback{
void invoke ( IntByReference p1);
//void invoke(String filename , int i);
}
public class FunCallBack implements OpenFunc{
@Override
/*public void invoke(String filename , int i){
System.out.println("callback called.");
System.out.println(filename);
}*/
public void invoke( IntByReference p1){
System.out.println(p1);
System.out.println("callback called.");
}
}
void init(OpenFunc openfunc);
void swap( IntByReference p1 , IntByReference p2);
void test();
}
public static void main(String[] args) {
CLib lib =(CLib)Native.loadLibrary("JNALib", CLib.class);
CLib lib2 = (CLib)Native.loadLibrary("swap",CLib.class);
CLib.FunCallBack func = new CLib.FunCallBack();
IntByReference p1 = new IntByReference (3);
IntByReference p2 = new IntByReference (5);
lib.init( func);
lib2.swap(p1, p2);//Java called C++ pointer
lib.test();//C++ callback java
}
}
================================================
FILE: JNAPointer/README.md
================================================
# JNA Sample
---
**Java用JNA跨语言调用C++指针代码,在C++代码外封装一层C接口**
**Java将C++指针映射为Pointer类**
+ 先执行cppComplie.sh生成动态链接库
+ 再执行javarun.sh运行Java程序
================================================
FILE: JNAPointer/callback.cpp
================================================
#include
#include
using namespace std;
extern "C"
{
typedef void (*OpenFunc) (const char*, int);
OpenFunc openfunc=NULL;
void init(OpenFunc func){
cout << "init called" <
#include
using namespace std;
extern "C"{
void swap(int *p1,int *p2);
void swap(int *p1,int *p2){
cout << "p1="<< *p1 << ",p2=" << *p2 <
================================================
FILE: NIO/pom.xml
================================================
Basic-Java
com.crow
1.0-SNAPSHOT
4.0.0
NIO
jar
NIO
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
================================================
FILE: NIO/src/main/java/com/crow/CopyFile.java
================================================
package com.crow;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* Created by CrowHawk on 17/9/4.
*/
public class CopyFile {
public static void main(String[] args) throws Exception {
if (args.length<2) {
System.err.println( "Usage: java CopyFile infile outfile" );
System.exit( 1 );
}
String infile = args[0];
String outfile = args[1];
FileInputStream fin = new FileInputStream( infile );
FileOutputStream fout = new FileOutputStream( outfile );
FileChannel fcin = fin.getChannel();
FileChannel fcout = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
while (true) {
buffer.clear();
int r = fcin.read(buffer);
if (r == -1) {
break;
}
buffer.flip();
fcout.write(buffer);
}
}
}
================================================
FILE: NIO/src/main/java/com/crow/CreateArrayBuffer.java
================================================
package com.crow;
import java.nio.ByteBuffer;
/**
* Created by CrowHawk on 17/9/4.
*/
public class CreateArrayBuffer {
static public void main( String args[] ) throws Exception {
byte array[] = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap( array );
buffer.put( (byte)'a' );
buffer.put( (byte)'b' );
buffer.put( (byte)'c' );
buffer.flip();
System.out.println( (char)buffer.get() );
System.out.println( (char)buffer.get() );
System.out.println( (char)buffer.get() );
}
}
================================================
FILE: NIO/src/main/java/com/crow/CreateBuffer.java
================================================
package com.crow;
import java.nio.ByteBuffer;
/**
* Created by CrowHawk on 17/9/4.
*/
public class CreateBuffer {
public static void main( String args[] ) throws Exception {
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
buffer.put( (byte)'a' );
buffer.put( (byte)'b' );
buffer.put( (byte)'c' );
buffer.flip();
System.out.println( (char)buffer.get() );
System.out.println( (char)buffer.get() );
System.out.println( (char)buffer.get() );
}
}
================================================
FILE: NIO/src/main/java/com/crow/MultiPortEcho.java
================================================
package com.crow;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
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;
import java.util.Set;
/**
* Created by CrowHawk on 17/9/4.
*/
public class MultiPortEcho {
private int ports[];
private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );
public MultiPortEcho( int ports[] ) throws IOException {
this.ports = ports;
go();
}
private void go() throws IOException {
Selector selector = Selector.open();
// Open a listener on each port, and register each one
// with the selector
for (int i=0; i < ports.length; i++) {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ServerSocket ss = ssc.socket();
InetSocketAddress address = new InetSocketAddress(ports[i]);
ss.bind(address);
//将新打开的 ServerSocketChannels 注册到 Selector上,指定监听accept事件
SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Going to listen on " + ports[i]);
}
while (true) {
int num = selector.select();//返回该选择器中对I/O事件准备就绪的channel对应的key的数量
Set selectedKeys = selector.selectedKeys();//返回key的集合
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {//遍历key集合,集合中的元素为SelectionKey类型
SelectionKey key = (SelectionKey) it.next();
if ((key.readyOps() & SelectionKey.OP_ACCEPT)
== SelectionKey.OP_ACCEPT) {//检查发生了什么类型的事件
// Accept the new connection
ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
SocketChannel sc = ssc.accept();
sc.configureBlocking( false );
// Add the new connection to the selector
SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );//监听read事件
//Selector不会自己从已选择键集中移除SelectionKey实例。必须在处理完通道时自己移除。下次该通道变成就绪时,Selector会再次将其放入已选择键集中。
it.remove();
System.out.println( "Got connection from "+sc );
}else if ((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ) {
// Read the data
SocketChannel sc = (SocketChannel)key.channel();
// Echo data
int bytesEchoed = 0;
while (true) {
echoBuffer.clear();
int r = sc.read( echoBuffer );
if (r<=0) {
break;
}
echoBuffer.flip();
sc.write( echoBuffer );
bytesEchoed += r;
}
System.out.println( "Echoed "+bytesEchoed+" from "+sc );
it.remove();
}
}
}
}
public static void main( String args[] ) throws Exception {
if (args.length<=0) {
System.err.println( "Usage: java MultiPortEcho port [port port ...]" );
System.exit( 1 );
}
int ports[] = new int[args.length];
for (int i=0; i 0; i++) {
System.out.println("Character" + i + ": " + (char)buffer.get());
}
fin.close();
}
}
================================================
FILE: NIO/src/main/java/com/crow/ScatterGather.java
================================================
package com.crow;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
/**
* Created by CrowHawk on 17/9/4.
*/
public class ScatterGather {
static private final int firstHeaderLength = 2;
static private final int secondHeaderLength = 4;
static private final int bodyLength = 6;
static public void main( String args[] ) throws Exception {
if (args.length!=1) {
System.err.println( "Usage: java UseScatterGather port" );
System.exit( 1 );
}
int port = Integer.parseInt( args[0] );
ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress( port );
ssc.socket().bind( address );
int messageLength =
firstHeaderLength + secondHeaderLength + bodyLength;
ByteBuffer buffers[] = new ByteBuffer[3];
buffers[0] = ByteBuffer.allocate( firstHeaderLength );
buffers[1] = ByteBuffer.allocate( secondHeaderLength );
buffers[2] = ByteBuffer.allocate( bodyLength );
SocketChannel sc = ssc.accept();
while (true) {
// Scatter-read into buffers
int bytesRead = 0;
while (bytesRead < messageLength) {
long r = sc.read( buffers );
bytesRead += r;
System.out.println( "r "+r );
for (int i=0; i < buffers.length; ++i) {
ByteBuffer bb = buffers[i];
System.out.println( "b " + i + " " + bb.position() + " " + bb.limit() );
}
}
// Process message here
// Flip buffers
for (int i=0; i
================================================
FILE: Proxy/pom.xml
================================================
Basic-Java
com.crow
1.0-SNAPSHOT
4.0.0
Proxy
jar
Proxy
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
================================================
FILE: Proxy/src/main/java/com/crow/Advice.java
================================================
package com.crow;
import java.lang.reflect.Method;
/**
* Created by CrowHawk on 17/2/20.
*/
public interface Advice {
void forwardMethod(Method method);
void backMethod(Method method);
}
================================================
FILE: Proxy/src/main/java/com/crow/ImpAdvice.java
================================================
package com.crow;
import java.lang.reflect.Method;
/**
* Created by CrowHawk on 17/2/20.
*/
public class ImpAdvice implements Advice {
long beginTime = 0;
public void forwardMethod(Method method){
System.out.println("end");
beginTime = System.currentTimeMillis();
}
public void backMethod(Method method){
System.out.println("start");
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " running time of " + (endTime - beginTime));
}
}
================================================
FILE: Proxy/src/main/java/com/crow/ProxyTest.java
================================================
package com.crow;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
/**
* Created by CrowHawk on 17/2/20.
*/
public class ProxyTest {
public static void main(String args[]){
ArrayList target = new ArrayList<>();//创建目标类的实例对象
ImpAdvice impAdvice = new ImpAdvice();
Collection proxy = (Collection) getProxy(target, impAdvice);//创建动态类
proxy.add("aa");
System.out.println(proxy.size());
System.out.println(proxy.getClass().getName());
}
public static Object getProxy(final Object target, final Advice advice){
Object proxy = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {//动态类通过Invocation类的invoke方法调用目标类所需的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Exception {
advice.forwardMethod(method);
Object retVal = method.invoke(target, args);
advice.backMethod(method);
return retVal;
}
}
);
return proxy;
}
}
================================================
FILE: README.md
================================================
# JavaLearning
本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的Java学习者入门进阶。
## 代码目录
+ [Java基础](https://github.com/CrowHawk/JavaLearning/tree/master/Basic-java):包括枚举、范型、反射、动态代理的用法;
+ [JNA](https://github.com/CrowHawk/JavaLearning/tree/master/JNAPointer):演示了JNA的基本用法,使用Java调用C++代码。
## 博客目录
### Java基础
+ [Java基础学习(1)——反射](https://crowhawk.github.io/2017/02/12/basic-java-reflect/)
+ [Java基础学习(2)——注解](https://crowhawk.github.io/2017/02/13/basic-java-annotation/)
+ [Java基础学习(3)——泛型](https://crowhawk.github.io/2017/02/21/basic-java-generic/)
+ [Java基础学习(4)——动态代理](https://crowhawk.github.io/2017/02/21/basic-java-proxy/)
+ [《Java多线程核心技术》读书笔记](https://crowhawk.github.io/2017/07/06/MultiThread/)
### JDK源码
+ [Java集合框架源码解读(1)——ArrayList、LinkedList和Vector](https://crowhawk.github.io/2017/08/26/collections_1/)
+ [Java集合框架源码解读(2)——HashMap](https://crowhawk.github.io/2017/08/27/collections_2/)
+ [Java集合框架源码解读(3)——LinkedHashMap](https://crowhawk.github.io/2017/08/28/collctions_3/)
+ [Java集合框架源码解读(4)——WeakHashMap](https://crowhawk.github.io/2017/08/29/collection_4/)
+ [Java集合框架源码解读(5)——TreeMap](https://crowhawk.github.io/2017/08/31/collection_5/)
### JVM
+ [深入理解JVM(1)——Java内存区域与Java对象](https://crowhawk.github.io/2017/08/09/jvm_1/)
+ [深入理解JVM(2)——GC算法与内存分配策略](https://crowhawk.github.io/2017/08/10/jvm_2/)
+ [深入理解JVM(3)——7种垃圾收集器](https://crowhawk.github.io/2017/08/15/jvm_3/)
+ [深入理解JVM(4)——如何优化Java GC「译」](https://crowhawk.github.io/2017/08/21/jvm_4/)
+ [深入理解JVM(5)——虚拟机类加载机制](https://crowhawk.github.io/2017/08/21/jvm_5/)
+ [深入理解JVM(6)——类加载器](https://crowhawk.github.io/2017/08/21/jvm_6/)
## 联系作者
[Personal Website:Crow Home](https://crowhawk.github.io/)
================================================
FILE: ReadAndShow.txt
================================================
Read And Show.
================================================
FILE: Reflect/Reflect.iml
================================================
================================================
FILE: Reflect/pom.xml
================================================
Basic-Java
com.crow
1.0-SNAPSHOT
4.0.0
Reflect
jar
Reflect
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
================================================
FILE: Reflect/src/main/java/com/crow/FieldReflect.java
================================================
package com.crow;
/**
* Created by CrowHawk on 17/2/8.
*/
public class FieldReflect {
public int a;
private int b;
public String str1 = "bat";
public String str2 = "but";
public String str3 = "bite";
public FieldReflect(){}
public FieldReflect(int a,int b){
super();
this.a = a;
this.b = b;
}
@Override
public String toString(){
return str1 + "," + str2 + "," + str3 + "," + a + "," + b;
}
}
================================================
FILE: Reflect/src/main/java/com/crow/ReflectTest.java
================================================
package com.crow;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/**
* Created by CrowHawk on 17/2/8.
*/
public class ReflectTest {
public static void main(String[] args) throws Exception{
FieldReflect fr = refConstructor(1,2);
System.out.println(fr.toString());
refFieldChange(fr, "a");
System.out.println("fr.a = " + fr.a);
refFieldChange(fr, "str1");
System.out.println("fr.str1 = " + fr.str1);
}
public static FieldReflect refConstructor(int a, int b) throws Exception{//使用反射构造器创建对象
Class[] paralist = {int.class, int.class};
Constructor cons = FieldReflect.class.getDeclaredConstructor(paralist);
FieldReflect fr = (FieldReflect) cons.newInstance(a, b);
return fr;
}
public static void refFieldChange(FieldReflect fr, String fieldName) throws Exception{
//使用Field类改变类的实例域,如果是int型,全部设为3,如果是String类型,将String中的"b"改为"c"
Field field = fr.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
if(field.getType() == int.class){
field.set(fr, 3);
}
else if(field.getType() == String.class) {
String string = (String) field.get(fr);
string.replace("b", "c");
field.set(fr, string);
}
else {
throw new IOException();
}
}
}
================================================
FILE: pom.xml
================================================
4.0.0
com.crow
Basic-Java
1.0-SNAPSHOT
Enumeration
Generic
Proxy
Reflect
JNA
NIO
pom
Basic-Java
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test