目录
运行时识别对象和类的信息
在 Java 中有两种方式可以让我们在运行时识别对象和类的信息。一种是 RTTI(运行时类型识别:Run-Time Type Identification),它假定了我们在编译时已经知道了所有的类型;另一种是我们本文要说的反射机制,它允许我们在运行时获取和使用类的信息。无论是 RTTI 还是反射,其本质都是一样的,都是去动态的获取类的信息。它们唯一不同的是,RTTI 在编译时期知道要解析的类型,而反射是在运行时才知道要解析的类型。
Field
Field是一个类,位于java.lang.reflect包下。在Java反射中Field类描述的是类的属性信息,功能包括:
- 获取当前对象的成员变量的类型
- 对成员变量重新设值
Field使用示例:
class Test{
private int a; //private field私有域
protected double b; //protected field保护域
public String c; //public field公共域
Test d; //default access field默认访问域
public static Object e; //public static field公共静态域
......
}
Java方法形参中的‘...’
如果是在方法形参里面出现数据类型后面加三个点,表示的是可变参数,即传入的参数可以随意,你传多少个参数都被放到一个列表里面。
例子:调用以下方法将会输出传入方法的每个变量。
public static void dealArray(int...arr) {
for(int i: arr){
System.out.print(i);
}
}
@link
语法格式:{@link 全路径包名#方法名(参数类型列表)}
可以链接代码,让注释看的更清楚易懂
{@link Constants#LONGLIVE} 的意思其实就是告诉你LONGLIVE参数在哪里,即在Constants类的LONGLIVE对象
java.net.NetworkInterface
此类表示由名称和分配给此接口的IP地址列表组成的网络接口。它用于标识多播组加入的本地接口。接口通常以诸如“le0”之类的名称而为人所知。
JUnit @Ignore
注解下的测试方法将被忽略,不被执行。
LinkedHashMap
LinkedHashMap继承于HashMap,跟HashMap一样,它也是提供了key-value的存储方式,并提供了put和get方法来进行数据存取。
HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。
fail-fast机制
“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。
要了解fail-fast机制,我们首先要对ConcurrentModificationException 异常有所了解。当方法检测到对象的并发修改,但不允许这种修改时就抛出该异常。同时需要注意的是,该异常不会始终指出对象已经由不同线程并发修改,如果单线程违反了规则,同样也有可能会抛出改异常。诚然,迭代器的快速失败行为无法得到保证,它不能保证一定会出现该错误,但是快速失败操作会尽最大努力抛出ConcurrentModificationException异常,所以因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。
lombok
lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然,这带来的副作用就是不易阅读。注意需要安装
lombok支持的一些常见的注解。
@NonNull
@Cleanup
@Getter/@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor
@Data
@Value
@SneakyThrows
@Synchronized
@Log