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 1487217889886 1487234520435 1487234799472 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