共计 2956 个字符,预计需要花费 8 分钟才能阅读完成。
本篇文章给大家分享的是有关如何理解 java reflect,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。
SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet();
Class ? selectorImplClass =
Class.forName(sun.nio.ch.SelectorImpl , false, ClassLoader.getSystemClassLoader());
// Ensure the current selector implementation is what we can instrument.
if (!selectorImplClass.isAssignableFrom(selector.getClass())) {
return selector;
}
Field selectedKeysField = selectorImplClass.getDeclaredField(selectedKeys
Field publicSelectedKeysField = selectorImplClass.getDeclaredField(publicSelectedKeys
selectedKeysField.setAccessible(true);
publicSelectedKeysField.setAccessible(true);
selectedKeysField.set(selector, selectedKeySet);
publicSelectedKeysField.set(selector, selectedKeySet);
selectedKeys = selectedKeySet;
先看第一行,SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet(); 这个东西干吗用的,替代 selector 默认实现当中的 selectKeys 这个字段,当中的实现非常牛逼。后续再看。
跳过无关紧要的部分,直接看这段
Field selectedKeysField = selectorImplClass.getDeclaredField(selectedKeys
Field publicSelectedKeysField = selectorImplClass.getDeclaredField(publicSelectedKeys
取得 2 个 field,目的是忘对象 selector 里面设值。
selectedKeysField.setAccessible(true);
publicSelectedKeysField.setAccessible(true);
selectedKeysField.set(selector, selectedKeySet);
publicSelectedKeysField.set(selector, selectedKeySet);
然后就是设值可访问属性,并且修改 selector 的 2 个属性(selectedKeys 和 publicSelectedKeys),设值为之前 new 出来的 selectedKeySet,再让 selectedKeys = selectedKeySet,selector 在执行 select 的时候,就会修改 selectedKeys 当中的属性值。
然后再看看 SelectedSelectionKeySet 当中究竟干了些什么:
final class SelectedSelectionKeySet extends AbstractSet SelectionKey {
private SelectionKey[] keysA;
private int keysASize;
private SelectionKey[] keysB;
private int keysBSize;
private boolean isA = true;
SelectedSelectionKeySet() {
keysA = new SelectionKey[1024];
keysB = keysA.clone();
}
@Override
public boolean add(SelectionKey o) {
if (o == null) {
return false;
}
if (isA) {
int size = keysASize;
keysA[size ++] = o;
keysASize = size;
if (size == keysA.length) {
doubleCapacityA();
}
} else {
int size = keysBSize;
keysB[size ++] = o;
keysBSize = size;
if (size == keysB.length) {
doubleCapacityB();
}
}
return true;
}
private void doubleCapacityA() {
SelectionKey[] newKeysA = new SelectionKey[keysA.length 1];
System.arraycopy(keysA, 0, newKeysA, 0, keysASize);
keysA = newKeysA;
}
private void doubleCapacityB() {
SelectionKey[] newKeysB = new SelectionKey[keysB.length 1];
System.arraycopy(keysB, 0, newKeysB, 0, keysBSize);
keysB = newKeysB;
}
SelectionKey[] flip() {
if (isA) {
isA = false;
keysA[keysASize] = null;
keysBSize = 0;
return keysA;
} else {
isA = true;
keysB[keysBSize] = null;
keysASize = 0;
return keysB;
}
}
@Override
public int size() {
if (isA) {
return keysASize;
} else {
return keysBSize;
}
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator SelectionKey iterator() {
throw new UnsupportedOperationException();
}
}
用 keysA 和 keysB 2 个数组,轮流保存 SelectionKey,非常方便的实现了读写分离,用数组代替了 set,极大地提高了内存访问效率。
以上就是如何理解 java reflect,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。