目录
61、网络编程:
TCP程序:使用三次握手和四次挥手的方式保证所有的数据可靠的进行传输
UDP程序:发送数据报,而接收数据报的一方不一定可以接收到信息
(1)java.net包:
服务端通过ServerSockert类的构造方法绑定端口,再通过accept()方法等待客户端连接
客户端通过Socket类的构造方法绑定IP地址以及端口,然后Socket类可以通过方法获取输入输出流对象
这个网络通信是基于TCP协议的,处理流程如下:
(2)Echo程序模型:
Echo模型最大的特点在于:客户端发送数据给服务器,服务器端接收到此数据之后直接进行回应,并且这种回应的处理可以持续进行,当客户确定不再需要继续进行交互的时候则断开整个的服务器连接
(3)BIO程序模型:
步骤:|- 创建一个多线程客户端处理类,接收客户端Socket对象,通过Socket对象获得输入输出流进行交互
|- 服务端通过while循环不断的接收等待连接的Socket,并将其传入多线程客户端处理类,开启处理线程
BIO(Blocking IO 、阻塞IO处理)是最为传统的一种网络通讯模型的统一描述,这种模型主要是为了解决服务器的并发处理问题,通过之前的程序已经成功的实现了一个ECHO交互模型,但是这个模型本身存在有一个问题:当前的操作属于单线程服务器的开发,同一时间段只能够有一个线程进行访问
(4)UDP程序:
客户端使用DatagramSocket类构造设置客户端监听端口,然后创建数据报对象DatagramPacket,最后使用DatagramSocket对象的receive()方法进行接收服务器端数据报
62、反射:
不管是new,还是反射,根本上都是使用Class来实例化对象,每个类在JVM中只会产生一个Class对象
new是静态的,反射是动态的
Class类定义时虽然使用了泛型,但是大部分时候都是使用通配符?
(1)获取Class类实例的三种方法
(a)通过Object类中的getClass()方法
(b)直接使用 类.class
(c)使用Class类中的 forName(String name)方法(注意:使用此方法不需要进行name所对应的开发包的导入)
(2)反射实例化类对象:
注意:getDeclaredConstructor()方法返回的是Object类型,如果想要用原类型接收,那么就会涉及到向下转型和开发包导入的问题
(3)反射与工厂设计模式:
传统的静态工厂如果所需要创建的子类特别多,那么就会影响性能,而使用反射之后的动态工厂则不会
(4)反射与单利设计模式:
注意:多线程下此种单利设计可能会因为指令重排而出错,使用voletile关键字可以解决
在懒汉式单利设计模式中,使用同步块sychrolized锁的对象是本类的Class对象,之所以是这个是因为,只需要对实例化的时候上锁就可以了,如果锁了方法和属性则会影响性能,不能锁this,因为单利中获取对象的方法是static方法
(5)反射获取类结构信息Class类中的方法:
(6)Constructor类:
(a)Class类中获取Constructor类的方法:
(b)Constructor类中的方法:
(7)Method类:
(a)Class类中获取Method类的方法:
注意:一个是类中的方法,一个是本类中的方法
(b)Method类中的方法:
Method类中的访问修饰符返回的是各种修饰符在Java中对应的数字,要想获取其名称可以通过Modifier类中的toString方法
(8)Field类:
(a)Class类中获取Field类的方法:
(b)Field类中的方法:
注意:当设置私有属性时,需要使用AccessibleObject类中的setAccessible()方法设置封装可见性为true才可以
(9)Unsafe类:
(10)ClassLoader类加载器(抽象类):
java有很多层的类加载器,要想获得父类加载器,可以通过ClassLoader中提供的getParent()方法完成
注意:使用系统类String查看类加载器的时候会返回null,此空就代表其使用的是Bootstapt根加载器
注意:之所以在整个java设计的范畴里面为整个JVM设计有不同层次的类加载器,主要的原因在于要实现“双亲加载”,提高类加载器的安全级别,在java中对于所有的系统类使用系统类的加载器,如果是用户自定义的类使用自定义类的加载器,这样的目的是为了防止因为类重名而加载恶意代码造成程序的安全性问题
(11)自定义类加载器:
使用自定义的类加载器可以加载没有包路径里面的.class文件信息(也就是类)
(12)反射与代理设计模式:
(a)静态代理:
接口定义了核心的功能业务,代理类与被代理类都继承该接口,代理类接收被代理类,在调用核心功能方法的前后会调用代理类中各种辅助功能方法
(b)JDK原生支持的动态代理:
动态代理指的是可以为某一类相同功能的真实主题类实现服务,动态代理设计模式是在JDK1.3的时候正式引入到Java体系结构中的如果要想实现动态代理类,那么就要掌握“InvocationHandler接口”,“Proxy接口"
注意:动态代理类和静态代理类最大的区别在于,其代理操作程序类都是由系统生成
动态代理的控制流程:
使用Proxy类中的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法创建代理子类
(c)CGLIB动态代理:
CGLIB动态代理不要求被代理类有接口
代理服务类需要继承MethodInterceptor接口(CGLIB中的方法拦截器)
63、Annotation注解(JDK1.5):
AnnotationElement接口中的方法:
64、自定义注解:
(1)限定自定义注解的运行范围:
所有的Annotation都有其运行的范围,在程序中通过“@Rentetion”注解来进行配置,其中有三个配置项(具体的运行范围是由“RetentionPolicy”枚举来进行定义的):
-
SOURCE:在源代码的编写过程中生效
-
CLASS:在类定义的时候生效
-
RUNTIME:在类执行的时候生效
(2)限定注解的作用地方(注解、类、方法、构造、参数等):
(3)定义一个自定义注解:
注意:value属性在进行内容定义的时候可以直接进行编写,而不需要使用 属性 = 内容 的语法结构