Java反射之调用构造方法and操作数组

二者共用一个Person类,请看代码。。

首先是通过Java反射方式调用构造方法的demo

package com.jadyer.reflection; import java.lang.reflect.Constructor; /** * 反射方式调用构造方法 */ public class InvokeConstructor { public static void main(String[] args)throws Exception { Class<?> clazz = Class.forName("com.jadyer.model.Person"); //创建一个Class对象,用于描述Person类 /** * 调用有参的构造方法 */ Class<?>[] argTypes = {String.class, Integer.class}; //指明所要调用的构造方法的形参 Constructor<?> constructor = clazz.getConstructor(argTypes);//获取指定参数的构造方法 Object obj = constructor.newInstance("盗墓笔记", 888);//通过给定的实参,创建一个对象,它的返回值即新建对象的句柄 System.out.println(obj); //打印新创建的对象。这里会自动调用toString()输出它的两个属性的值 /** * 调用无参构造方法 * @see 也可以使用下面的两种方式,获取无参的构造方法 * @see constructor = clazz.getConstructor(new Class[0]) * @see constructor = clazz.getConstructor(null) * @see 另外也可以使用obj = clazz.newInstance()创建无参构造方法的一个对象 */ obj = clazz.getConstructor().newInstance(); //获取无参的构造方法,并使用其创建一个对象 System.out.println(obj); //打印新创建的对象的属性的值,这里仍会自动调用它的toString()方法 } }

然后是共用的Person类

package com.jadyer.model; public class Person { public String name; public Integer age; public Person(){} public Person(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "Name:" + name + "/tAge:" + age; } }

最后是通过Java反射方式操作数组的demo

package com.jadyer.reflection; import java.lang.reflect.Array; import com.jadyer.model.Person; /** * 反射方式操作数组 */ public class ProcessArray { public static void main(String[] args) { int[] records = {89, 56, 43, 77, 33}; Person[] persons = {new Person("张起灵",26), new Person("汪藏海",36), new Person("铁面生",46)}; records = (int[])incrementArray(records); persons = (Person[])incrementArray(persons); list(records); //这里输出的五行零,是扩容后的数组的默认初始化的值 System.out.println("---------------------------------------"); list(persons); //这里输出的三行null,是扩容后的数组的默认初始化的值 System.out.println("---------------------------------------"); int[][] aa = (int[][])Array.newInstance(int.class, 2, 3); //创建多维数组,指定元素类型和每维的长度 System.out.println(aa); } /** * 加倍指定数组的容量,同时将原数组的元素依次保存到扩容后的新数组中 */ public static Object incrementArray(Object array){ Class<?> elementType = array.getClass().getComponentType(); //获取数组元素的类型 int size = Array.getLength(array); //获取数组的原始容量 Object newArray = Array.newInstance(elementType, size*2);//按照指定的元素类型和容量,创建新数组 // System.arraycopy(array,0,newArray,0,size); //赋值数组元素,下面是为了更好的阐述反射机制 for (int i=0; i<size; i++) { //复制数组元素 Object obj = Array.get(array, i); //获取array数组中的第i个元素,返回的是Object类型 Array.set(newArray, i, obj);//设置目标数组newArray的第i个元素的值为obj } return newArray; } /** * 显示指定数组中所有的元素 */ public static void list(Object array){ int size = Array.getLength(array); //用反射API的方式获取指定数组对象的长度 for (int i=0; i<size; i++) { System.out.println(Array.get(array, i)); //输出该数组中的每一个元素 } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值