java反射机制其实就是将Java类中的各个成员映射成一个个的Java对象,这在开发中我们有时候会用到java反射,但是对于新手来说,还不清楚java反射机制原理是什么?下面来我们就来给大家讲解一下。
反射的实现利用Class类,在Java中万物都是对象,类也不例外,类本身也是对象,每个类别都是Class类别的对象。
一个类别加载后,在方法区域创建代表该类别的Class类别的对象,该对象保存该类别的所有信息,作为访问该类别的入口。
因此,在运行过程中,如果你想通过发射获取某种类型的信息,首先JVM检查该类型是否已经加载,如果没有,首先加载,然后通过调用相应的Class对象获取该类型的信息。
如何利用反射创建数组?
数组是Java中一种特殊的数据类型,可以赋值给一个Object Reference
利用反射创建数组的示例:
public static void ArrayTest() throws ClassNotFoundException { Class < ? > cls = class.forName("java.lang.String"); Object array = Array.newInstance(cls, 25); // 在数组中添加数据 Array.set(array, 0, "C"); Array.set(array, 1, "Java"); Array.set(array, 2, "Python"); Array.set(array, 3, "Scala"); Array.set(array, 4, "Docker"); // 获取数据中的某一项内容 System.out.println(Array.get(array, 3)); }
Array类是java.lang.reflect.Array类,通过Array.newInstance() 创建数组对象:
public static Object newInstance(Class < ? > componentType, int length) throws NegativeArraySizeException { return newArray(componentType, length); }
newArray方法是一个native方法,具体实现在HotSpot JVM中,源码如下:
private static native Object newArray(Class < ? > componentType, int length) throws NegativeArraySizeException; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - newArray源码目录: openjdk\ hotspot\ src\ share\ vm\ runtime\ reflection.cpp arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) { if (element_mirror == NULL) { THROW_0(vmSymbols::java_lang_NullPointerException()); } if (length < 0) { THROW_0(vmSymbols::java_lang_NegativeArraySizeException()); } if (java_lang_Class::is_primitive(element_mirror)) { Klass * tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL); return TypeArrayKlass::cast(tak) - > allocate(length, THREAD); } else { Klass * k = java_lang_Class::as_Klass(element_mirror); if (k - > oop_is_array() && ArrayKlass::cast(k) - > dimension() >= MAX_DIM) { THROW_0(vmSymbols::java_lang_IllegalArgumentException()); } return oopFactory::new_objArray(k, length, THREAD); } }
Array类的set和get方法都是native方法,具体实现在HotSpot JVM中,对应关系如下:
set:Reflection::array_set
get: Reflection::array_get
通过 Java 的反射机制,程序员可以更深入地控制程序的运行过程。不过java反射机制会有一定的弊端,如果非必要的时候建议不要使用!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: