千家信息网

如何理解java reflect

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,本篇文章给大家分享的是有关如何理解java reflect,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SelectedSelectio
千家信息网最后更新 2025年02月04日如何理解java reflect

本篇文章给大家分享的是有关如何理解java reflect,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

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 {

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 iterator() {
throw new UnsupportedOperationException();
}
}

用 keysA 和 keysB 2个数组,轮流保存SelectionKey,非常方便的实现了读写分离,用数组代替了set,极大地提高了内存访问效率。

以上就是如何理解java reflect,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0