- 浏览: 325244 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xuanyuanxiaoxue:
...
Android - LayoutInflater -
柴兴博:
不错 多谢
Android 悬浮Activity并可拖动(访悬浮歌词) -
di1984HIT:
写的很好,我收藏一下。
java之动态代理模式(JDK和cglib) -
chinacssnj:
待测试,明天测,测试的结果发给大家
网络开发上传文件到服务器 -
fx_199182:
...
Android之MediaPlayer
数组反射
如果因为某种原因,您并不确定参数或对象是不是数组,您可以检索对象的 Class 对象并询问它。 Class 类的 isArray() 方法将会告诉您。一旦您知道拥有了一个数组,您可以询问 Class 的 getComponentType() 方法,您实际拥有的是什么类型的数组。如果 isArray() 方法返回 false,那么 getComponentType() 方法返回空。否则返回元素的 Class 类型。如果数组是多维的,您可以递归调用 isArray() 。它将仍只包含一个 component 类型。此外,您可以用在 java.lang.reflect 包里找到的 Array 类的 getLength() 方法获取数组的长度。
为了演示,清单 2-3 显示了传递给 main() 方法的参数是 java.lang.String 对象的数组,其中数组长度由命令行参数的个数确定:
清单 2-3. 使用反射检查数组类型和长度
public class ArrayReflection { public static void main (String args[]) { printType(args); } private static void printType (Object object) { Class type = object.getClass(); if (type.isArray()) { Class elementType = type.getComponentType(); System.out.println("Array of: " + elementType); System.out.println(" Length: " + Array.getLength(object)); } } }
注意:如果 printType() 用于前面定义的 buttons 和 components 变量调用,每个都会表明数组是 java.awt.Button 类型。
如果不使用 isArray() 和 getComponentType() 方法,而且试图打印数组的 Class 类型,您将获得一个包含 [ ,后面跟着一个字母和类名(如果是个基本数据类型就没有类名)的字符串。例如,如果您试图打印出上述 printType() 方法中的类型变量,您将获得 class [Ljava.lang.String; 作为输出。
除了询问一个对象是不是数组以及是什么类型的数组之外,您还可以在运行时用 java.lang.reflect.Array class 创建数组。这对于创建一般实用例程非常有用,这些例程执行数组任务,比如将大小加倍。(我们会立即回到那一点。)
要创建一个新数组,使用 Array 的 newInstance() 方法,它有两种变化形式。对于一维数组您通常将使用较简单版本,它的执行方式如语句 new type [length] 所示,并作为对象返回数组: public static Object newInstance(Class type, int length) 。例如,下面的代码创建一个五个整数空间大小的数组:
int array[] = (int[])Array.newInstance(int.class, 5);
注意:要为基本数据类型指定 Class 对象,只要在基本数据类型名末尾添加 .class 就可以了。您还可以使用包装类中的 TYPE 变量,如 Integer.TYPE。
newInstance() 方法中的第二种变化形式要求维数被指定为整型数组: public static Object newInstance(Class type,int dimensions []) 。在创建一个一维数组的最简单的情况下,您将创建只有一个元素的数组。换句话说,如果您要创建包含五个整数的相同数组,您需要创建一个单个元素 5 的数组并传递到 newInstance() 方法,而不是传递整数值 5。
int dimensions[] = {5}; int array[] = (int[])Array.newInstance(int.class, dimensions);
在您只需要创建一个矩形数组的时候,您就可以将每个数组长度填充到这个 dimensions 数组中。例如,下面的代码与创建一个 3 X 4 的整数数组等价。
int dimensions[] = {3, 4}; int array[][] = (int[][])Array.newInstance(int.class, dimensions);
但是,如果您需要创建一个非矩形数组,您将需要多次调用 newInstance() 方法。第一次调用将定义外部数组的长度,并获得一个看上去很古怪的类参数([].class 适用于元素为 float 类型的数组)。每个后续调用将定义每个内部数组的长度。例如,下面演示了如何创建一个元素为 float 类型的数组,其内部数组的大小设置像一组保龄球瓶:第一排一个元素,第二排两个,第三排三个,第四排四个。为了帮您将这种情况形象化,让我们回顾早先在图 2-4 展示的三角形数组。
float bowling[][] = (float[][])Array.newInstance(float[].class, 4); for (int i=0; i<4; i++) { bowling[i] = (float[])Array.newInstance(float.class, i+1); }
一旦在运行时创建了数组,您还可以获取和设置数组元素。不过通常不会这样做,除非键盘上的方括号键失灵或者您在动态的编程环境(程序被创建时数组名 未知)中工作。 如表 2-2 所示, Array 类有一系列的 getter 和 setter 方法用来获取和设置数组元素。使用什么方法取决于您处理的数组类型。
表 2-2. 数组 getter 和 setter 方法
Getter 方法 Setter 方法
get(Object array, int index) set(Object array, int index, Object value) getBoolean(Object array, int index) setBoolean(Object array, int index, boolean value) getByte(Object array, int index) setByte(Object array, int index, byte value) getChar(Object array, int index) setChar(Object array, int index, char value) getDouble(Object array, int index) setDouble(Object array, int index, double value) getFloat(Object array, int index) setFloat(Object array, int index, float value) getInt(Object array, int index) setInt(Object array, int index, int value) getLong(Object array, int index) setLong(Object array, int index, long value) getShort(Object array, int index) setShort(Object array, int index, short value)
注意:您可以一直使用 get() 和 set() 方法。如果数组是一个基本数据类型数组, get() 方法的返回值或 set() 方法的值参数将被包装到用于基本数据类型的包装类中,像装着一个 int 数组的 Integer 类那样。
清单 2-4 提供了一个如何创建、填充以及显示数组信息的完整示例。方括号只在 main() 方法的声明中使用。
清单 2-4. 使用反射创建、填充和显示数组
import java.lang.reflect.Array; import java.util.Random; public class ArrayCreate { public static void main (String args[]) { Object array = Array.newInstance(int.class, 3); printType(array); fillArray(array); displayArray(array); } private static void printType (Object object) { Class type = object.getClass(); if (type.isArray()) { Class elementType = type.getComponentType(); System.out.println("Array of: " + elementType); System.out.println("Array size: " + Array.getLength(object)); } } private static void fillArray(Object array) { int length = Array.getLength(array); Random generator = new Random(System.currentTimeMillis()); for (int i=0; i<length; i++) { int random = generator.nextInt(); Array.setInt(array, i, random); } } private static void displayArray(Object array) { int length = Array.getLength(array); for (int i=0; i<length; i++) { int value = Array.getInt(array, i); System.out.println("Position: " + i +", value: " + value); } } }
运行时,输出将如下所示(尽管随机数会不同):
Array of: int Array size: 3 Position: 0, value: -54541791 Position: 1, value: -972349058 Position: 2, value: 1224789416
让我们返回到早先的,创建一个将数组大小加倍的方法的示例。既然您知道如何获取数组的类型,您可以创建一种方法用来将任意类型数组的大小加倍。这个方法确保我们能在获取它的长度和类型之前得到数组。然后在复制原来的那组元素之前,它将新数组的大小加倍。
static Object doubleArray(Object original) { Object returnValue = null; Class type = original.getClass(); if (type.isArray()) { int length = Array.getLength(original); Class elementType = type.getComponentType(); returnValue = Array.newInstance(elementType, length*2); System.arraycopy(original, 0, returnValue, 0, length); } return returnValue; }
发表评论
-
java clone技术 浅谈
2011-10-23 14:58 8881.java里的clone分为: A:浅复制(浅克隆): ... -
java synchronized详解
2011-10-23 10:31 723记下来,很重要。 Java语言的关键字,当它用来修饰一 ... -
Java 多线程同步 锁机制与synchronized
2011-10-21 17:25 1357打个比方:一个object就像一个大房子,大门永远打开。房子里 ... -
Java多线程编程总结(转载)
2011-10-21 16:54 728http://www.blogjava.net/cmzy/ar ... -
java内部类的总结
2011-10-15 14:42 678从Java1.1开始引入 ... -
java中的io系统详解
2011-10-10 11:26 713参考:http://expert.iteye.com/blog ... -
Java代码编写的30条建议
2011-10-10 10:22 722(1) 类名首字母应该大写 ... -
Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释
2011-09-20 11:21 1273标题有点长,可能有点 ... -
六种异常处理的陋习
2011-09-19 14:42 678你觉得自己是一个Java专 ... -
Java中常见的异常
2011-09-19 14:05 919Java 中异常的分类 所有异常,都继承自 ... -
Java异常的分类 .
2011-09-18 21:52 7611. 异常机制 异 ... -
Java中反射机制详解
2011-09-13 14:53 1210问题: 在运行时,对一个JAVA类,能否知道属性和方 ... -
java枚举之EnumSet and EnumMap
2011-09-12 20:17 2585一:EnumSet import java.util.*; ... -
java中获取日期函数应用
2011-09-10 17:11 828(1)String类型转换成日期(Date类型) Sim ... -
java 时间格式化问题
2011-09-10 17:05 974java 时间格式化问题 java.util.*; ... -
Java深度历险之Java泛型
2011-09-10 16:46 698Java泛型(generics)是JDK ... -
Java 集合篇
2011-09-07 18:51 7561. Java集合类库中最重要的两个接口Collec ... -
Comparable和Comparator接口
2011-09-06 13:13 738当需要排序的集合或数组不是单纯的数字型时,通常可以使用C ... -
Java对象初始化顺序
2011-09-06 10:56 1259前几天与fwb同学说起java笔试题,想起这个东西经常被考,重 ... -
全面接触Java集合框架
2011-09-05 23:33 847http://www.iteye.com/topic/1647 ...
相关推荐
java 反射中操作数组 java 反射中操作数组 java 反射中操作数组
主要介绍了Java编程中数组反射的使用方法,通过编写数组反射工具类可以重用许多基础代码,减少对类型的判断过程,需要的朋友可以参考下
主要介绍了详解java中反射机制(含数组参数)的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
Java SE编程入门教程 java数组(共33页).pptx Java SE编程入门教程 java网络编程(共29页).pptx Java SE编程入门教程 java线程(共61页).pptx Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门...
java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)
Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法
Java技术对接收数组参数的成员方法进行反射 让初学者更易懂
使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 我的代码里主要有一下知识点: 1.获取Class对象的三种方式 2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射...
java反射数组和java动态代理和反射机制
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...
内容概要:通过带着读者编写Java基础语法测试代码,理解基础数据类型-注解-数组-inet-反射-oop-Java代码实现过程和测试代码 适合人群:初学java语法入门测试代码 能学到什么:①注解、数组、数据类型、inet、method...
Java基础知识点,内容比较全面。 目录: 1.1 Java中的引用概念 1.2 Java多线程相关知识 1.3 Java中的垃圾回收算法 1.4 Java IO流相关知识 1.5 JVM ClassLoader机制 ...1.14 Java数组浅析 。。。。。。
Java SE编程入门教程 java数组(共33页).pptx Java SE编程入门教程 java网络编程(共29页).pptx Java SE编程入门教程 java线程(共61页).pptx Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门...
实验三 Java 数组和方法应用 10 实验四 类和对象;类的继承和派生;多态性;接口;构造器应用 16 实验五 Java访问控制管理;封装类;内部类; 内存管理与垃圾收集 8 实验六 Java 异常处理的程序设计;Java 自定义...
java源程序 课件 常用类 抽象类与接口 图形用户界面 多线程反射 泛型 时间日期类 数组 异常处理 字符串类与正则表达等相关知识的ppt课件和源程序代码,是初学者的帮手,包含了Java所需的所有知识点。。。。
NULL 博文链接:https://1017401036.iteye.com/blog/2343714
可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变数组中的某项的值、改变数组大小等;可以学习Java的动态代理模式、学习Java工厂模式以及如何将工厂模式与属性文件相结合。
学习反射的时候学到的一点东东。 用到的知识点: java.lang.reflect.Array List 集合 内部的实现就是这样的。如果下面的新数组的长度增长原来的一倍,就是Vector集合了。
本Java视频教程适合有一定编程语言基础的学员观看,在本Java视频教程中讲解了Java面向对象、异常、数组、常用类、集合、IO流、线程、反射机制。该视频教程基于Java13进行讲解,Java13是目前Java最新版本。视频中讲师...