Java反射 数组

Java反射 数组

大家好,又见面了,我是全栈君。

在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链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107611.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 关于tcp连接中timewait的作用

    关于tcp连接中timewait的作用今天简单的谈一下tcp连接中timewait的作用,如果没有timewait会发生什么呢?我们知道首先请求关闭连接的一方会存在timewait状态。首先我们来看一下tcp四次挥手的过程示意图:客户端首先发起FIN请求,所以客户端会进入time_wait状态。如果没有time_wait或者用户自己通过调整tcp_tw_recycle缩短了time_wait的时间会出现生什问题呢?

    2022年6月9日
  • windows 安装Anaconda和PyCharm 安装配置pytorch环境 伪保姆级教程

    windows 安装Anaconda和PyCharm 安装配置pytorch环境 伪保姆级教程windows安装Anaconda和PyCharm安装配置pytorch环境伪保姆级教程写在前面:如果有刚刚起步的小白,可以先看看这段话,主要是介绍Anaconda、PyCharm的区别,不需要的可以跳过。PyCharm是一种常用的python编程IDE。用来运行和调试python代码。Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。运行环境和工具包的下载与安装可以由Anaconda进行管理。也就是说如果你装了Ana

    2022年8月28日
  • 5分钟商学院之个人篇–习惯与素养

    1.高效能人士的习惯思维转换如果只想发生较小的变化,专注于自己的态度和行为;但如果想发生实质性的变化,就需要思维转换,改变理解世界的方式思维转换就是改变人们理解世界的方式,怎样才能打开思维转换

    2021年12月30日
  • Android名词解释_古代汉语名词解释汇总

    Android名词解释_古代汉语名词解释汇总什么叫刷机刷机,是手机方面的专业术语,是指通过一定的方法更改或替换了手机原版系统中固有的一些语言、图片、铃声和软件版本或者操作系统,可以使手机功能更加完善。刷机可以是官方的,也可以是非官方的。再简单点说,刷机就是一种改变你手机操作系统的一种行为,就相当于给电脑装上不同版本的windows或则电脑重装系统,也就是刷手机的操作系统吧。目前常说的刷机就是用“更改替换了一些图片、铃声或菜单后的软件

    2022年10月10日
  • 找出重复两次的数–有且只有一个数字重复两次,其余都不重复「建议收藏」

    找出重复两次的数–有且只有一个数字重复两次,其余都不重复「建议收藏」问题描述:数字范围是0-99的整数,给出101个整数,其中只有一个是重复两次的数,找出这个数分析:如果是有序的话,遍历一次就可以找出方法一:先排序,再遍历,遍历超过一次方法二:只是排序,排序过程中对于元素相等这一特殊情况拿出来判断,直接返回相等的这个元素,方法三:使用亦或运算符 ^ ,这个也是刚了解到的,遍历一次 相同数字 亦或一次 结果是 0 不同数异或一次,结果是 1 …

    2022年6月13日
  • [NOIP2011真题]选择客栈[通俗易懂]

    [NOIP2011真题]选择客栈[通俗易懂]题目背景NOIP2011提高组DAY1试题。题目描述丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号。每家客栈都按照某一种色调进行装饰(总共k种,用整数0~k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一

    2022年9月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号