代理也分静态代理/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 字符流转字节流,字符使用指定编码写成字节,