java-java.lang.reflect.Array

本文提供了两个Java示例,展示了如何使用反射API创建并操作数组,包括一维数组的设置和获取元素,以及构建和操作三维数组的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class TestArray01 {

    public static void main(String[] args) throws Exception {
        Class<?> classType = Class.forName("java.lang.String");
        
        //构造一个数组对象
        Object array = Array.newInstance(classType, 10);
        //为指定的数组对象的指定元素赋值
        Array.set(array, 5, "hello");
        
        String str = (String)Array.get(array, 5);
        
        System.out.println(array.toString());
        //Integer.TYPE返回的是int
        System.out.println(Integer.TYPE);
        //Integer.class返回的是Integer
        System.out.println(Integer.class);
    }
}

 

三维数组设值:

import java.lang.reflect.Array;

public class TestArray02 {

    public static void main(String[] args) {
        int[] dims = new int[]{5, 10, 15};
        //构造一个以dims数组维度的int类型的数组对象
        Object threeArray = Array.newInstance(Integer.TYPE, dims);
        System.out.println(threeArray instanceof int[][][]);
        
        //Returns the value of the indexed component in the specified array object.
        //The value is automatically wrapped in an object if it has a primitive type.
        Object twoArray = Array.get(threeArray, 3);
        
        System.out.println(twoArray instanceof int[][]);
        //Returns the Class representing the component type of an array.
        //If this class does not represent an array class this method returns null.
        //Class<?> classType = twoArray.getClass().getComponentType();
        
        Object oneArray = Array.get(twoArray, 5);
        System.out.println(oneArray instanceof int[]);
        
        Array.set(oneArray, 10, 37);
        
        int [][][] castarr = (int[][][])threeArray;
        
        System.out.println(castarr[3][5][10]);
        
    }
}

转载于:https://www.cnblogs.com/charleszhang1988/archive/2013/04/29/3051217.html

当你尝试将一个包含Array类型的字符串反序列化到`java.lang.reflect.Array`,而实际上接收到的是数组值时,可能会遇到这个问题。这是因为序列化和反序列化默认处理的是具体的数组类型,而不是`Array`类本身。 要解决这个问题,你可以按照以下步骤操作: 1. **自定义序列化器**:创建一个自定义的`ObjectOutputStream`或`ObjectInputStream`的适配器,比如实现`Serializable`接口的`ArraySerializer`或`ArrayDeserializer`。这个类需要有一个方法来解析输入的Array字符串并将其转换为实际的数组实例。 ```java public class ArraySerializer extends ObjectOutputStream { @Override public void writeObject(Object obj) throws IOException { if (obj instanceof String && Array.class.isInstance(obj)) { // 解析字符串得到数组类型和元素列表 Class<?> componentType = getComponentTypeFromString((String) obj); List<Object> arrayElements = ...; // 根据字符串构建数组元素 writeArray(arrayElements, componentType); } else { super.writeObject(obj); } } private void writeArray(List<Object> elements, Class<?> componentType) throws IOException { // 实现将List转换为实际数组并序列化 Array.arrayCopy(elements.toArray(), 0, out, 0, elements.size()); } } public class ArrayDeserializer extends ObjectInputStream { @Override protected Object readUnshared() throws IOException, ClassNotFoundException { return isWriting() ? readArray() : super.readUnshared(); } private Array readArray() throws IOException { // 读取序列化的数组数据,并构造对应的Array对象 String arrayDesc = readUTF(); // 读取描述符(如"[Ljava/lang/String;") String[] components = arrayDesc.substring(1, -1).split(","); // 提取组件类型 Class<?> componentType = Class.forName(components[0].trim()); int length = readInt(); // 读取数组长度 return Array.newInstance(componentType, length); } } ``` 2. **使用`@JsonDeserialize`和`@JsonSerialize`注解**:如果你正在使用JSON库(如Jackson),可以利用这些注解来指定自定义的反序列化和序列化逻辑。 ```java @JsonDeserialize(using = ArrayDeserializer.class) @JsonSerialize(using = ArraySerializer.class) private Object myArrayField; ``` 3. **手动转换**:在反序列化后,检查是否是`Array`类型,然后转换成具体的数组实例。 ```java String serializedArrayStr = ...; Object unserialized = yourDeserializationMethod(serializedArrayStr); if (unserialized instanceof String && Array.class.isInstance(unserialized)) { Class<?> componentType = ...; // 获取组件类型 unserialized = Array.getArrayInstance(componentType, ((String) unserialized).split("\\[")[1].split("\\]")[0].split(",")); // 转换为数组 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值