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


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

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

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

然后是共用的Person类

  1. package com.jadyer.model;   
  2.   
  3. public class Person {   
  4.     public String name;   
  5.     public Integer age;   
  6.        
  7.     public Person(){}   
  8.        
  9.     public Person(String name, Integer age) {   
  10.         this.name = name;   
  11.         this.age = age;   
  12.     }   
  13.        
  14.     @Override  
  15.     public String toString() {   
  16.         return "Name:" + name + "\tAge:" + age;   
  17.     }   
  18. }  

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

  1. package com.jadyer.reflection;   
  2.   
  3. import java.lang.reflect.Array;   
  4.   
  5. import com.jadyer.model.Person;   
  6.   
  7. /**  
  8.  * 反射方式操作数组  
  9.  */  
  10. public class ProcessArray {   
  11.     public static void main(String[] args) {   
  12.         int[] records = {8956437733};   
  13.         Person[] persons = {new Person("张起灵",26), new Person("汪藏海",36), new Person("铁面生",46)};   
  14.         records = (int[])incrementArray(records);   
  15.         persons = (Person[])incrementArray(persons);   
  16.            
  17.         list(records); //这里输出的五行零,是扩容后的数组的默认初始化的值   
  18.         System.out.println("---------------------------------------");   
  19.            
  20.         list(persons); //这里输出的三行null,是扩容后的数组的默认初始化的值   
  21.         System.out.println("---------------------------------------");   
  22.            
  23.         int[][] aa = (int[][])Array.newInstance(int.class23); //创建多维数组,指定元素类型和每维的长度   
  24.         System.out.println(aa);   
  25.     }   
  26.        
  27.     /**  
  28.      * 加倍指定数组的容量,同时将原数组的元素依次保存到扩容后的新数组中  
  29.      */  
  30.     public static Object incrementArray(Object array){   
  31.         Class<?> elementType = array.getClass().getComponentType(); //获取数组元素的类型   
  32.         int size = Array.getLength(array); //获取数组的原始容量   
  33.         Object newArray = Array.newInstance(elementType, size*2);//按照指定的元素类型和容量,创建新数组   
  34.         // System.arraycopy(array,0,newArray,0,size); //赋值数组元素,下面是为了更好的阐述反射机制   
  35.         for (int i=0; i<size; i++) { //复制数组元素   
  36.             Object obj = Array.get(array, i); //获取array数组中的第i个元素,返回的是Object类型   
  37.             Array.set(newArray, i, obj);//设置目标数组newArray的第i个元素的值为obj   
  38.         }   
  39.         return newArray;   
  40.     }   
  41.        
  42.     /**  
  43.      * 显示指定数组中所有的元素  
  44.      */  
  45.     public static void list(Object array){   
  46.         int size = Array.getLength(array); //用反射API的方式获取指定数组对象的长度   
  47.         for (int i=0; i<size; i++) {   
  48.             System.out.println(Array.get(array, i)); //输出该数组中的每一个元素   
  49.         }   
  50.     }   
  51. }  

相关内容