Java使用反射编写泛型数组代码

news/2024/5/19 6:19:09 标签: 反射, Java, 泛型数组

 

一个对象数组不能转换成雇员数组(Employee[ ])。如果这样做,则在运行时 Java 将会产生 ClassCastException 异常。前面已经看到,Java 数组会记住每个元素的类型,即创建数组时 new 表达式中使用的元素类型。将一个 Employee[ ]临时地转换成 Object[ ] 数组, 然后再把它转换回来是可以的,但一 从开始就是 Objectt ] 的数组却永远不能转换成 Employe[]数组。为了编写这类通用的数组代码, 需要能够创建与原数组类型相同的新数组。为此, 需要 java.lang.reflect 包中 Array 类的一些方法。其中最关键的是 Array类中的静态方法 newlnstance,它能够构造新数组。在调用它时必须提供两个参数,一个是数组的元素类型,一个是数组的长度。

Object newArray = Array.newlnstance(componentType , newLength);

为了能够实际地运行,需要获得新数组的长度和元素类型。

可以通过调用 Array.getLength(a) 获得数组的长度,也可以通过 Array 类的静态 getLength方法的返回值得到任意数组的长度。而要获得新数组元素类型,就需要进行以下工作:

1 ) 首先获得 a 数组的类对象。

2 ) 确认它是一个数组。

3 ) 使用 Class 类(只能定义表示数组的类对象)的 getComponentType 方法确定数组对应的类型。

下面是一些常用的方法:

static Object get(Object array,int index)

static xxx get/xx(Object array,int index)

( xxx 是 boolean、byte、 char、 double、 float、 int、 long、 short 之中的一种基本类M。)

这些方法将返回存储在给定位置上的给定数组的内容。

static void set(Object array,int index,Object newValue)

static setXxx(Object array,int index,xxx newValue)

( xxx 是 boolean、 byte、char、double、float、 int、 long、 short 之中的一种基本类型。)

这些方法将一个新值存储到给定位置上的给定数组中。

static int getLength(Object array)返回数组的长度。

static Object newInstance(Class componentType,int length)

static Object newInstance(Class componentType,int[]lengths)

返回一个具有给定类型、 给定维数的新数组。
package demo01;

import java.lang.reflect.*;
import java.util.*;


public class CopyOfTest
{
   public static void main(String[] args)
   {
      int[] a = { 1, 2, 3 };
      a = (int[]) goodCopyOf(a, 10);
      System.out.println(Arrays.toString(a));

      String[] b = { "Tom", "Dick", "Harry" };
      b = (String[]) goodCopyOf(b, 10);
      System.out.println(Arrays.toString(b));

      System.out.println("The following call will generate an exception.");
      b = (String[]) badCopyOf(b, 10);
   }

   
   public static Object[] badCopyOf(Object[] a, int newLength) // not useful
   {
      Object[] newArray = new Object[newLength];
      System.arraycopy(a, 0, newArray, 0, Math.min(a.length, newLength));
      return newArray;
   }

   
   public static Object goodCopyOf(Object a, int newLength) 
   {
      Class cl = a.getClass();
      if (!cl.isArray()) return null;
      Class componentType = cl.getComponentType();
      int length = Array.getLength(a);
      Object newArray = Array.newInstance(componentType, newLength);
      System.arraycopy(a, 0, newArray, 0, Math.min(length, newLength));
      return newArray;
   }
}
[1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
[Tom, Dick, Harry, null, null, null, null, null, null, null]
The following call will generate an exception.
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
	at demo01.CopyOfTest.main(CopyOfTest.java:20)

 


http://www.niftyadmin.cn/n/898632.html

相关文章

Java使用反射实例化类,得到域的值,调用该类的方法

获得类和实例 我们以汽车类型为例: public class Car {private String name "111";public double salary 12.0;public String getName() {return name;}private void setName(String name) {this.name name;}public double getSalary() {return sala…

用Eclipse和TomCat搭建一个网站(创建WEB项目)

首先,我们打开Eclipse,根据下图操作即可: 我们首先绑定JDK 然后我们新建一个web工程 如果没有的话 web工程就搭好了,接下来我们引入一下包 这样一个网站就搭好了

SQL常用语句(大全)

我们先看一下表的结构: -- sql语句创建表 CREATE TABLE student2 (id int(11) NOT NULL AUTO_INCREMENT,stuname varchar(10) NOT NULL,class varchar(20) NOT NULL,sex int(11) NOT NULL,major varchar(20) NOT NULL,mathstore int(11) DEFAULT NULL,yuwenstore i…

使用AJAX实现数据的增删改查

主页&#xff1a;index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script></head><body>…

使用git创建分支并上传

首先我们简单的熟悉一下git的常用命令 git clone 地址 这是下拉命令 git config --global credential.helper store 保存密码 git config --system --unset credential.helper 清除错误登陆缓存 git status 查看修改信息 git add 文件路径/文件名 选中更新的文件准备提交到仓…

AJAX的同步和异步刷新

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题。最近的项目用了到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载&#xff0c;页面出去假死状态&#xff0c;当这个AJAX执行完毕后才会继续运行其他代码页面假…

Java的匿名内部类

顾名思义&#xff0c;没有名字的内部类。表面上看起来它们似乎有名字&#xff0c;实际那不是它们的名字。   匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类&#xff1f;如果满足下面的一些条件&#xff0c;使用匿名内部类是比较合适的&#xff1a;   只…

Java的静态内部类

有时候&#xff0c; 使用内部类只是为了把一个类隐藏在另外一个类的内部&#xff0c;并不需要内部类引用外围类对象。为此&#xff0c;可以将内部类声明为 static, 以便取消产生的引用。下面是一个使用静态内部类的典型例子。考虑一下计算数组中最小值和最大值的问题。当然&…