emove(int) public E get(int) public Object clone() public int indexOf(Object) public void clear() public boolean contains(Object) public boolean isEmpty() public Iterator iterator() public int lastIndexOf(Object) public void replaceAll(UnaryOperator) public int size() public List subList(int,int) public T[] toArray(T[]) public Object[] toArray() public Spliterator spliterator() public boolean addAll(int,Collection extends E>) public boolean addAll(Collection extends E>) public void forEach(Consumer super E>) public E set(int,E) public void ensureCapacity(int) public void trimToSize() public ListIterator listIterator(int) public ListIterator listIterator() public boolean removeAll(Collection>) public boolean removeIf(Predicate super E>) public boolean retainAll(Collection>) public void sort(Comparator super E>) public boolean equals(Object) public int hashCode() public String toString() public boolean containsAll(Collection>) public final void wait() throws InterruptedException public final void wait(long,int) throws InterruptedException public final native void wait(long) throws InterruptedException public final native Class> getClass() public final native void notify() public final native void notifyAll() public default Stream stream() public default Stream parallelStream()
JVM 反射机制并没有什么神奇之处。当通过反射与一个未知类型的对象打交道时,JVM只是简单的检查这个对象。因此,那个类的.class文件对于JVM来说必须是可获取的:要么在本地机器上,要么可以通过网络取得。对已反射机制来说,.class文件在编译时时不可获取的 所以是在运行时打开和检查.class文件。
应用 假设开发者从磁盘文件,或者网络连接中获取一串字节,并且被告知这些字节代表了一个类。既然这个类在程序编译后很久才出现,若想使用这个类,就需要采用发射机制。热加载就属于这种场景。
在运行时获取类的信息的另一个场景,开发者希望提供在跨网络的远程平台上创建和运行对象的能力。这被称为远程方法调用(RMI) 它允许一个Java程序将对象分布到多台机器上。
在自己写框架时候,开发者肯定会用到反射,很简单的例子就是事件总线和注解框架。
总结
反射很灵活,在日常开发中,慎用少用反射,反射会牺牲部分性能。在写框架时,不避讳反射,在关键时利用反射助自己一臂之力。
|