代理也分靜態代理/jdk動態代理和cglib代理(字節碼技術)
------------------------------------
被代理的類不必定位於本機類,動態代理語法提供了一種抽象方式,
被代理的類也能夠位於遠程主機上,這也是RPC框架實現原理的一部分java
1,給調用者使用的代理類。在java中,咱們發現動態代理提供的抽象自然契合面向接口編程,
所以它也有多是接口。
2,一個統一的處理函數,收集不一樣函數轉發過來的請求,可自定義處理邏輯集中處理。java中它可能會成爲一個較獨立的部分,
所以也多是類。
第一個部分,給調用者使用的代理類。在java動態代理機制中,這個角色只能是接口
第二個角色,統一的處理函數。在java中它的確是類,經過實現InvocationHandler接口定義
代理本地對象,所以還須要一個被代理對象的類
---------------------------------------------------------------------------
動態裝飾器
將分散的對對象不一樣方法的調用轉發到一個同一的處理函數中來。
Reactor模式
Reactor 1:建立一個Selector 和一個ServerSocketChannel
將監聽端口綁定到Channel中,設置channel爲非阻塞,
在Selector上註冊本身感興趣的事件,讀寫或者鏈接事件。
Reactor(int port) throws IOException {
selector = Selector.open();
serverSocket = ServerSocketChannel.open();
serverSocket.socket().bind(new InetSocketAddress(port));
serverSocket.configureBlocking(false);
SelectionKey sk = serverSocket.register(selector, SelectionKey.OP_ACCEPT);
sk.attach(new Acceptor());
}
Reactor 2: Dispatch Loop
selector.select()是阻塞的,一旦又請求到來時,就會從selector中獲取到對應的SelectionKey ,
而後將其下發給後續處理程序(工做線程)進行處理
//無限循環等待網絡請求的到來
//其中selector.select();會阻塞直到有綁定到selector的請求類型對應的請求到來,
一旦收到事件,處理分發到對應的handler,並將這個事件移除
Reactor 3: Acceptor
Acceptor也是一個線程,在其run方法中,經過判斷serverSocket.accept()方法來獲取SocketChannel,
只要SocketChannel 不爲空,則建立一個handler進行相應處理編程
Reactor 4: Handler setup
一個handler就是一個線程,其中的SocketChannel 被設置成非阻塞。
默認在Selector上註冊了讀事件並綁定到SocketChannel 上。網絡
Reactor 5: Request handling
針對不一樣的請求事件進行處理
Worker Thread Pools for Reactor
考慮到工做線程的複用,將工做線程設計爲線程池
在handler中使用線程池來處理任務
------------------------------------------------------
類加載機制:加載類文件讀取文件內容(類的解析)若是有超類也會被加載,執行靜態的main方法
三個類加載器:引導類加載器rt.jar,系統類加載器(應用類加載器),擴展類加載器jre/lib/ext
---------------------------
OutputStreamWriter 字符流轉字節流,字符使用指定編碼寫成字節,框架