java反射机制原理是什么?如何利用反射创建数组?

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工具网。

推荐阅读:

程序员面试一般问什么?程序员面试常见问题

JAVA写程序时主类的名字和什么要相等?JAVA怎么写程序?

java出现异常程序会终止吗?Java异常怎么处理?