JAVA学习日记:反射机制(5)

反射机制学习日记(5)

今天是第五课:
主要内容:

	如何运用反射机制创建一个数组对象
	运用反射机制访问数组元素
	如何获取数组元素的类型信息

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余年高校项目实践毕设指导经验;企业软培经验丰富。

你可能感兴趣的:(JAVA学习,java,反射,编程语言,类,后端)