介紹:
這個類是基于反射的一個工具類,用于對一個類的 volatile int 的值進行一個原子修改闪幽。
詳解:
其實這個類的實現(xiàn)和其他的Atomic類的實現(xiàn)差不多,都是一個cas 的原理,只不過在這基礎上用了反射來控制對象的字段。
這個類通過一個抽象類蒋譬,內(nèi)部有個實現(xiàn)類,通過
@CallerSensitive
public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,
String fieldName) {
return new AtomicIntegerFieldUpdaterImpl<U>
(tclass, fieldName, Reflection.getCallerClass());
}
來構造實現(xiàn)類愉适,而實現(xiàn)類也不復雜羡铲,主要做了一些鑒權的工作
AtomicIntegerFieldUpdaterImpl(final Class<T> tclass,
final String fieldName,
final Class<?> caller) {
final Field field;
final int modifiers;
try {
//將這個方法作標示為特權方法
field = AccessController.doPrivileged(
new PrivilegedExceptionAction<Field>() {
public Field run() throws NoSuchFieldException {
return tclass.getDeclaredField(fieldName);
}
});
//獲取修飾符
modifiers = field.getModifiers();
//判斷調(diào)用類對對象類在 modifiers修飾符下有權限調(diào)用
sun.reflect.misc.ReflectUtil.ensureMemberAccess(
caller, tclass, null, modifiers);
ClassLoader cl = tclass.getClassLoader();
ClassLoader ccl = caller.getClassLoader();
if ((ccl != null) && (ccl != cl) &&
((cl == null) || !isAncestor(cl, ccl))) {
//如果調(diào)用方不是被調(diào)用方的祖先的話,檢查包訪問權限
sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass);
}
} catch (PrivilegedActionException pae) {
throw new RuntimeException(pae.getException());
} catch (Exception ex) {
throw new RuntimeException(ex);
}
Class<?> fieldt = field.getType();
//判斷是否是int
if (fieldt != int.class)
throw new IllegalArgumentException("Must be integer type");
//判斷是否為volatile
if (!Modifier.isVolatile(modifiers))
throw new IllegalArgumentException("Must be volatile type");
//這步是為了之后的權限校驗儡毕,如果不為null 之后調(diào)用會校驗包權限
this.cclass = (Modifier.isProtected(modifiers) &&
caller != tclass) ? caller : null;
this.tclass = tclass;
//獲取偏移量
offset = unsafe.objectFieldOffset(field);
}
其他的部分實現(xiàn)和普通的Atomic類差不多,看這個把java權限部分知識補了一下扑媚。
參考資料 :
https://www.ibm.com/developerworks/cn/java/j-lo-rtsecurity/index.html
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh