Java反射 - 数组

简介: 在Java中使用数组反射有时可能有点棘手。 特别是如果您需要获取某个类型的数组的类对象,如int []等。本文将讨论如何通过Java Reflection创建数组并获取其类对象。

在Java中使用数组反射有时可能有点棘手。 特别是如果您需要获取某个类型的数组的类对象,如int []等。本文将讨论如何通过Java Reflection创建数组并获取其类对象。

java.lang.reflect.Array中

通过Java处理数组反射是使用java.lang.reflect.Array类完成的。 请不要将此类与Java Collections套件中的java.util.Arrays类混淆,该类包含用于对数组进行排序的实用程序方法,将它们转换为集合等。

创建数组

通过Java创建数组反射是使用java.lang.reflect.Array类完成的。 下面是一个显示如何创建数组的示例:

int[] intArray = (int[]) Array.newInstance(int.class, 3);

此代码示例创建一个int数组。 给Array.newInstance()方法的第一个参数int.class告诉数组中每个元素应该是什么类型。 第二个参数说明数组应该有多少空间。

访问数组

也可以使用Java Reflection来访问数组的元素。 这是通过Array.get(...)和Array.set(...)方法完成的。 这里是一个例子:

int[] intArray = (int[]) Array.newInstance(int.class, 3);

Array.set(intArray, 0, 123);
Array.set(intArray, 1, 456);
Array.set(intArray, 2, 789);

System.out.println("intArray[0] = " + Array.get(intArray, 0));
System.out.println("intArray[1] = " + Array.get(intArray, 1));
System.out.println("intArray[2] = " + Array.get(intArray, 2));

获取类对象的一个数组

我在Butterfly DI Container中实现脚本语言时碰到的一个问题是如何通过Java Reflection获取数组的Class对象。 使用非反射代码,你可以这样做:

Class stringArrayClass = String[].class;

这样做使用Class.forName()不是很简单。 例如,你可以像这样访问基本的int数组类对象:

Class intArray = Class.forName("[I");

JVM通过字母I表示一个int。[左边的意思是它是我感兴趣的int数组的类。这也适用于所有其他基元。

对于需要使用稍微不同的记号的对象:

Class stringArrayClass = Class.forName("[Ljava.lang.String;");

注意[L在类名的左边, 在右边。 这意味着具有给定类型的对象数组。

作为一个方面说明,你不能使用Class.forName()来获取原语的类对象。 下面的两个例子都会导致一个ClassNotFoundException异常:

Class intClass1 = Class.forName("I");
Class intClass2 = Class.forName("int");

我通常做这样的事情来获取原语和对象的类名:

public Class getClass(String className){
  if("int" .equals(className)) return int .class;
  if("long".equals(className)) return long.class;
  ...
  return Class.forName(className);
}

一旦获得了一个类型的Class对象,就有了一个简单的方法来获得该类型的数组的Class。 解决方法或者你可能称之为的解决方法是创建一个所需类型的空数组,并从该空数组中获取类对象。 这是一个骗子,但它可以工作。

Class theClass = getClass(theClassName);
Class stringArrayClass = Array.newInstance(theClass, 0).getClass();

这提供了一个单一的,统一的方法来访问任何类型的数组类。 没有摆弄类名等

为了确保Class对象确实是一个数组,你可以调用Class.isArray()方法来检查:

Class stringArrayClass = Array.newInstance(String.class, 0).getClass();
System.out.println("is array: " + stringArrayClass.isArray());

获取数组的组件类型

一旦获得数组的Class对象,就可以通过Class.getComponentType()方法访问其组件类型。 组件类型是数组中项目的类型。 例如,一个int []数组的类型是int.class类对象。 String []数组的类型是java.lang.String类的对象。

这是访问组件类型数组的一个例子:

String[] strings = new String[3];
Class stringArrayClass = strings.getClass();
Class stringArrayComponentType = stringArrayClass.getComponentType();
System.out.println(stringArrayComponentType);

这个例子将打印出字符串数组类型的文本“java.lang.String”。

实战

package com.reflection.detail;

import java.lang.reflect.Array;

/**
 * Created by Fant.J.
 * 2018/2/7 16:50
 */
public class Reflection_Arrays {
    public static void main(String[] args) throws ClassNotFoundException {

        //用反射来定义一个int类型,3长度的数组
        int[] intArray = (int[]) Array.newInstance(int.class, 3);

        Array.set(intArray, 0, 123);
        Array.set(intArray, 1, 456);
        Array.set(intArray, 2, 789);

        System.out.println("intArray[0] = " + Array.get(intArray, 0));
        System.out.println("intArray[1] = " + Array.get(intArray, 1));
        System.out.println("intArray[2] = " + Array.get(intArray, 2));

        //获取类对象的类型
        Class aClass = getClass("int");
        //获取类对象的一个数组
        Class stringArrayClass = Array.newInstance(aClass, 0).getClass();
        System.out.println("is array: " + stringArrayClass.isArray());


        //获取数组的组件类型
        String[] strings = new String[3];
        Class stringArrayClass2 = strings.getClass();
        Class stringArrayComponentType = stringArrayClass2.getComponentType();
        System.out.println(stringArrayComponentType);






    }
    static Class getClass(String className) throws ClassNotFoundException {
        if("int" .equals(className)) {return int .class;}
        if("long".equals(className)) {return long.class;}

        return Class.forName(className);
    }
}

intArray[0] = 123
intArray[1] = 456
intArray[2] = 789
is array: true
class java.lang.String

项目代码:github链接

相关文章
|
2月前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
2月前
|
存储 Java 索引
Java基础(六):数组
Java基础(六):数组
36 10
Java基础(六):数组
|
2月前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
82 12
|
3月前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
4月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
4月前
|
Java
Java的反射
Java的反射。
50 2
|
5月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
50 4
|
5月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
65 2
|
5月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
71 0
[Java]反射
|
5月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
136 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等