`
san_yun
  • 浏览: 2652702 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

动态创建数组对象

    博客分类:
  • java
 
阅读更多

java的数组对象比较特殊,如果一个方法的参数申明是Long[],但你传递一个Object[]数据(当然实际值是Long)会报错。

这时候就需要通过java.lang.reflect.Array

 

 

java.lang.reflect.Array

Working with arrays via Java Reflection is done using the java.lang.reflect.Array class. Do not confuse this class with the java.util.Arrays class in the Java Collections suite, which contains utility methods for sorting arrays, converting them to collections etc.

Creating Arrays

Creating arrays via Java Reflection is done using the java.lang.reflect.Array class. Here is an example showing how to create an array:

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

This code sample creates an array of int . The first parameter int.class given to the Array.newInstance() method tells what type each element in the array should be of. The second parameter states how many elements the array should have space for.

Accessing Arrays

It is also possible to access the elements of an array using Java Reflection. This is done via the Array.get(...) and Array.set(...) methods. Here is an example:

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));

This code sample will print out this:

intArray[0] = 123
intArray[1] = 456
intArray[2] = 789

Obtaining the Class Object of an Array

One of the problems I ran into when implementing the script language in Butterfly DI Container was how to obtain the Class object for arrays via Java Reflection. Using non-reflection code you can do like this:

Class stringArrayClass = String[].class;

Doing this using Class.forName() is not quite straightforward. For instance, you can access the primitive int array class object like this:

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

The JVM represents an int via the letter I . The [ on the left means it is the class of an int array I am interested in. This works for all other primitives too.

For objects you need to use a slightly different notation:

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

Notice the [L to the left of the class name, and the ; to the right. This means an array of objects with the given type.

As a side note, you cannot obtain the class object of primitives using Class.forName() . Both of the examples below result in a ClassNotFoundException :

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

I usually do something like this to obtain the class name for primitives as well as objects:

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

Once you have obtained the Class object of a type there is a simple way to obtain the Class of an array of that type. The solution, or workaround as you might call it, is to create an empty array of the desired type and obtain the class object from that empty array. It's a bit of a cheat, but it works. Here is how that looks:

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

This presents a single, uniform method to access the array class of arrays of any type. No fiddling with class names etc.

To make sure that the Class object really is an array, you can call the Class.isArray() method to check:

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

Obtaining the Component Type of an Array

Once you have obtained the Class object for an array you can access its component type via the Class.getComponentType() method. The component type is the type of the items in the array. For instance, the component type of an int[] array is the int.class Class object. The component type of a String[] array is the java.lang.String Class object.

Here is an example of accessing the component type array:

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

This example will print out the text "java.lang.String" which is the component type of the String array.

分享到:
评论

相关推荐

    C#中动态声明与使用对象数组实例

    在C#编程语言中,动态声明与使用对象数组是一种常见的操作,特别是在处理不确定数量的数据时。本实例将探讨如何在C#中实现这一功能,并关注数组的声明、使用、数据保护以及内存管理。 首先,我们要了解C#中的数组。...

    js解析php数组对象数组对象数组对象.docx

    - 使用 `new Array()` 构造函数创建数组。 - 或者使用数组字面量 `[ ]` 来定义数组。 ```javascript var names = new Array("张三", "李四", "王五"); // 或者 var names = ["张三", "李四", "王五"]; ``` 3...

    C++Builder动态对象数组

    ### C++Builder动态对象数组:TList类、DynamicArray与STL中的Vector容器 #### TList 类 在C++Builder中,TList是用于管理动态对象数组的一种方式。它提供了较为简便的方式来创建、管理和销毁一系列对象。TList...

    vc++6.0中动态数组实现(例如string类对象数组等)[文].pdf

    如果我们在自由存储区中创建的数组存储了内置类型的 const 对象,则必须为这个数组提供初始化。例如: ```cpp const int *pci_ok = new const int[100](); // ok: value-initialized const array ``` C++ 允许定义类...

    C C++ C++ Builder创建动态数组

    在C++ Builder中,动态数组的创建方式略有不同,因为它是基于Delphi的面向对象环境,支持更高级的语法特性。例如,创建一个动态整数数组可以这样写: ```cpp int* arr = new int[size]; ``` 或者使用内置的`__array...

    js中动态创建关联数组的问题

    在JavaScript中,关联数组(也称为哈希表或字典)是一种特殊的数据...在动态创建关联数组时,确保你清楚地知道是在创建一个数组还是一个对象,以及如何正确地遍历和操作它们。理解这两者的差异是避免混淆和错误的关键。

    经典ASP读取JSON字符串/生成JSON对象,数组对象等。

    这篇关于“经典ASP读取JSON字符串/生成JSON对象,数组对象等”的知识将详细介绍如何在ASP环境中处理JSON数据。 1. **JSON对象与数组的结构**: JSON对象以大括号{}表示,键值对之间用逗号分隔。键必须是字符串,用...

    多发子弹-动态控件数组

    这将在控件数组中创建五个Button对象。 2. 添加控件到数组: 要向数组中添加控件,可以使用Add方法,如`Set buttons(i) = New Button`,并设置控件的属性,如位置、大小、文本等。之后,可以将其添加到窗体上,如`...

    javascript中数组、对象

    在JavaScript中,数组和对象是两种非常基础且重要的数据结构,它们被广泛应用于各种场景,如数据存储、逻辑处理和对象表示。这篇文章将深入探讨这两种数据类型,以及相关的操作和工具。 **一、数组** 数组在...

    Java基础第4章(数组对象).pptx

    数组的创建有两种方式:静态初始化和动态初始化。 1. 静态初始化: 在声明数组时直接指定元素的值,例如: ```java int[] arr = new int[]{10, 30, 20, 35, 5}; String[] names = new String[]{"西门", "全蛋", ...

    java 基础 数组对象

    当我们谈论“数组对象”时,我们通常指的是数组中的元素是对象,而不是基本数据类型(如int,double等)。在Java中,数组可以存储基本类型的数据,也可以存储对象的引用。本节将深入探讨对象数组和二维数组的概念,...

    VB 动态数组实例

    考虑到VB中的集合类(如`Collection`),它们在某些情况下可以作为动态数组的替代品,特别是当数组需要存储不同类型对象时。集合类提供了更多的灵活性,但相比数组,它们的访问速度可能会慢一些。 9. **数组操作...

    环形数组(介绍、配置、使用步骤、环形数组对象、API).pdf

    - 返回值:成功创建返回环形数组对象指针,失败返回`NULL`。 4. **删除动态环形数组** ```c void ringbuf_delete(ringbuf_t *obj); ``` - `obj`:环形数组对象。 - 返回值:无。 5. **获取环形数组已使用...

    js一维数组、多维数组和对象的混合使用方法.docx

    使用这个函数,即使面对动态变化的多维数组结构,也能准确地计算元素数量。 总之,JavaScript中的数组和对象提供了强大的数据组织能力。它们可以灵活地混合使用,支持一维、二维乃至更高维度的数组,以及嵌套的对象...

    动态数组C++实现2

    拷贝赋值运算符确保当一个动态数组对象被赋值给另一个对象时,正确地处理内存。析构函数则在对象生命周期结束时释放分配的内存,防止内存泄漏。例如: ```cpp // 拷贝赋值运算符 DynamicArray& operator=(const ...

    java 动态的数组链表

    在Java编程语言中,动态数组链表是一种常见的数据结构,它结合了数组和链表的特点,既能快速访问数组中的元素,又能方便地进行插入和删除操作。本文将深入探讨Java中实现动态数组链表的关键概念、操作以及其实现方式...

    返回MFC动态库函数动态数组

    2. **函数接口设计**:为了在DLL中返回动态数组,函数的返回类型不能直接是动态数组,因为C++不允许返回动态分配的对象。一种常见的解决方法是返回数组的指针,同时通过参数传递数组的大小。例如: ```cpp extern ...

    比较json对象中的两个数组含有的相同元素,点击按钮输出新的数组

    2. **`reduce()` 和 `indexOf()`**:或者,我们可以使用`reduce()`方法来创建一个新的数组,只包含两个数组共同的元素。 ```javascript let commonElements = obj1.arr1.reduce((acc, current) => { if (obj2.arr2...

    动态数组 很全很详细

    // 创建一个初始大小为10的整数动态数组 ``` #### 复制数组 ```cpp Array<int> copyArr = arr; // 使用赋值操作符复制数组 ``` #### 访问元素 ```cpp arr[0] = 5; // 设置第一个元素的值为5 int firstElement = ...

Global site tag (gtag.js) - Google Analytics