注解
元注解
注解其他注解的注解
@Target
声明注解的作用范围
- CONSTRUCTOR:构造器
- FIELD:域
- LOCAL_VARIABLE:局部变量
- METHOD:方法
- PACKAGE:包
- PARAMETER:参数
- TYPE:类、接口或enum声明
@Retention
声明注解的生命周期
- SOURCE:在源文件中有效
- CLASS:在class文件中有效
- RUNTIME:在运行时有效
@Documented
标记注解,有该注解的注解会在生成java文档中保留。
@Inherited
表明子类继承了父类的注解。
自定义注解
注解的成员变量只支持原始类型、Class、Enumeration、Annoation。
ThreadLocal
优雅的使用ThreadLocal
ThreadLocal是每个线程独享的,可以维持线程的封闭性。它的get和set等方法为每个使用这个变量的线程都存有一份独立的副本,因此get总是返回由当前线程在调用set设置的最新值。
public T get() { }
public void set(T value) { }
public void remove() { }
protected T initialValue() { }
set方法
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
getMap方法
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
createMap方法
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
get方法
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}