Java反射之调用构造方法and操作数组
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)); //输出该数组中的每一个元素
- }
- }
- }
评论暂时关闭