今天是第五课: 主要内容:
如何运用反射机制创建一个数组对象 运用反射机制访问数组元素 如何获取数组元素的类型信息1.如何运用放射机制创建一个数组对象(含代码和注释):
1.创建引用类型的数组对象: 调用Array.newInstance(Class<?> componentType, int length)方法 第一个参数:要创建对象数组的类的名称.class 第二个参数:要创建对象数组的数组长度 调用Array.newInstance(Class<?> componentType, int...dimensions)可创建多维数组 第一个参数:要创建对象数组的类的名称.class 第二个参数:可变参数列表,数组维度 2.基本数据类型数组对象的创建: 调用方法和创建引用类型的数组对象一样2.运用反射机制访问数组元素(含代码和注释):
1.基本数据类型的数组: Array.set(后有基本数据类型名称)选取合适的即可 Array.get(后有基本数据类型名称)选取合适的即可 2.引用类型的数组: Array.set(Object array, int index, Object value): 第一个参数:需要访问的数组名称 第二个参数:访问的数组的下表 第三个参数:传入的变量,可以是对象也可以是构造方法 Array.get(Object array, int index)方法: 第一个参数:需要访问的数组名称 第二个参数:数组下标,需要拿个一个数组元素就填哪一个下标3.如何获取数组元素的类型信息(含代码和注释):
一个例子(代码部分也有): Card[] c4 = (Card[])Array.newInstance(Card.class, 3); if (c4.getClass().isArray()) { Class<?> c = c4.getClass().getComponentType(); String s = c.getName(); System.out.println("初始化c对象的数组的类型信息为:"+s+"类型"); //也可以这样写 System.out.println("初始化c对象的数组的类型信息为:"+c4.getClass().getComponentType().getName()+"类型"); }ArrayInforDemo类(实验这节课主要内容的类):
package LessonForReflection05; import java.lang.reflect.Array; public class ArrayInforDemo { public static void main(String[] args) { //1.创建引用类型的数组对象 /* * 调用Array.newInstance(Class<?> componentType, int length); * 第一个参数:要创建对象数组的类的名称.class * 第二个参数:要创建对象数组的数组长度 */ int i = 0; Card[] c1 = (Card[])Array.newInstance(Card.class, 4);//将其向下转型 c1[0] = new Card("01","河姆渡",6); System.out.println("c1[]的长度:"+c1.length); System.out.println("c1[0]的名称:"+c1[0].getName()); System.out.println("------------------1-----------------"); //2.基本数据类型数组对象的创建 /* * 调用方法与上面的一样 */ double[] d1 = (double[])Array.newInstance(double.class, 5); System.out.println("d1[]的长度:"+d1.length); System.out.println("d1[0]的值:"+d1[0]); /* 注意: * Double[] d2 = (Double[])Array.newInstance(double.class, 5); * double包装类没办法自动封装,所以是不能这样写的,这样写会抛出ClassCastException异常 * * 想要用包装类来创建你就得这样写,但这不是基本数据类型了: */ Double[] d2 = (Double[])Array.newInstance(Double.class, 5); d2[0] = new Double(2.0); System.out.println("d2[0]的值:"+d2[0]); System.out.println("------------------2-----------------"); //尝试使用第二种方式来创建数组对象 System.out.println("尝试使用第二种方式来创建数组对象:创建多维数组"); /* * Array.newInstance(Class<?> componentType, int...dimensions) * 第一个参数:要创建对象数组的类的名称.class * 第二个参数:可变参数列表,数组维度 */ Card[][] c2 = (Card[][])Array.newInstance(Card.class, 3, 4);// 创建一个包含有3个数组,并且每个数组为中分别又有四个元素的Card类对象对为数组 c2[0][0] = new Card("02","zlm",4); c2[0][1] = new Card("03","hlw",3); System.out.println("c2[0][0]="+c2[0][0].getName()+" c2[0][1]="+c2[0][1].getName()); int[][] i1 = (int[][])Array.newInstance(int.class, 3, 4); i1[0][0] = 4; i1[0][1] = 5; System.out.println("i1[0][0]="+i1[0][0]+" i1[0][1]="+i1[0][1]); System.out.println("------------------3-----------------"); System.out.println("通过反射机制操作数组元素:设置元素的值"); System.out.println("操作基本类型数组的元素"); //3.操作基本类型数组的元素: double[] d3 = (double[])Array.newInstance(double.class, 5); Array.setDouble(d3, 0, 0.0); Array.setDouble(d3, 1, 1.0); Array.setDouble(d3, 2, 2.0); Array.setDouble(d3, 3, 3.0); Array.setDouble(d3, 4, 4.0); for (double d:d3) { System.out.println(d); } // 还可以通过get方法获取值 for (i = 0; i<d3.length; i++) { System.out.println("通过Array.get(我没写完全,省略了类型)来得到d3中的值:"+Array.getDouble(d3, i)); } System.out.println("------------------4-----------------"); System.out.println("操作引用类型数组的元素"); //4.操作引用类型数组的元素: Card[] c3 = (Card[])Array.newInstance(Card.class, 3); Array.set(c3, 0, new Card("01","河姆渡1",1)); Array.set(c3, 1, new Card("02","河姆渡2",2)); Array.set(c3, 2, new Card("02","河姆渡3",3)); Array.get for (i = 0; i<c3.length; i++) { Card c = (Card)Array.get(c3, i); System.out.println("通过Array.get(我没写完全,省略了类型)来得c3中的名字"+c.getName()); } System.out.println("------------------5-----------------"); //如何获得数组元素的类型信息 System.out.println("如何获得数组元素的类型信息:"); Card[] c4 = (Card[])Array.newInstance(Card.class, 3); //getClass()方法:获得对象的Class的引用 //isArray()方法:判断一个对象是不是数组,该方法在Class类中 if (c4.getClass().isArray()) { Class<?> c = c4.getClass().getComponentType();//getComponentType()获得构成类型 String s = c.getName(); System.out.println("初始化c对象的数组的类型信息为:"+s+"类型"); //也可以这样写 System.out.println("初始化c对象的数组的类型信息为:"+c4.getClass().getComponentType().getName()+"类型"); } } }Card类(测试类):
package LessonForReflection05; public class Card { private String card_no; private String name; private int using_age; public Card(String card_no, String name, int using_age) { super(); this.card_no = card_no; this.name = name; this.using_age = using_age; } public String getCard_no() { return card_no; } public void setCard_no(String card_no) { this.card_no = card_no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getUsing_age() { return using_age; } public void setUsing_age(int using_age) { this.using_age = using_age; } } 部分文字来源于: 咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》 轻量化研习Java相关技术倡导者 “爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富。2020.10.08 可以转载我的学习日记但请注明出处,谢谢。