如何理解java reflect

77次阅读
没有评论

共计 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 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2956字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)