今天是第五课:
主要内容:
如何运用反射机制创建一个数组对象
运用反射机制访问数组元素
如何获取数组元素的类型信息
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余年高校项目实践毕设指导经验;企业软培经验丰富。