代理也分静态代理/jdk动态代理和cglib代理(字节码技术)
------------------------------------
被代理的类不一定位于本机类,动态代理语法提供了一种抽象方式,
被代理的类也可以位于远程主机上,这也是RPC框架实现原理的一部分
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 字符流转字节流,字符使用指定编码写成字节,