JAVA反射中的一点问题

在JAVA中,反射是一个很重要的方法。通过反射获得一个实例,如下:
  1. @SuppressWarnings("unchecked")
  2.     public Object newInstance(String className,Object[] args){
  3.         try{
  4.             Class myClass = Class.forName(className);
  5.             Class[] argsClass = new Class[args.length];
  6.             for(int i=0;i<args.length;i++){
  7.                 argsClass[i] = args[i].getClass();
  8.             }
  9.             Constructor con = myClass.getConstructor(argsClass);
  10.             return con.newInstance(args);
  11.         }catch (Exception e) {
  12.             return null;
  13.         }
  14.     }
而其中的Person类,如下:
  1. package com.company.code;
  2. public class Person {
  3.     private String name;
  4.     
  5.     public String age;
  6.     
  7.     private boolean sex;
  8.     
  9.     private String school;
  10.     
  11.     private int grade;
  12.     
  13.     public static String level = "Master";
  14.     
  15.     public Person(String name){
  16.         this.name = name;
  17.     }
  18.     
  19.     public Person(String name,String age){
  20.         this.name = name;
  21.         this.age = age;
  22.     }
  23.     
  24.     public Person(String name,String age,boolean sex){
  25.         this.name = name;
  26.         this.age = age;
  27.         this.sex = sex;
  28.     }
  29.     
  30.     public Person(String name,String age,boolean sex,String school){
  31.         this.name = name;
  32.         this.age = age;
  33.         this.sex = sex;
  34.         this.school = school;
  35.     }
  36.     
  37.     public Person(String name,String age,boolean sex,String school,int grade){
  38.         this.name = name;
  39.         this.age = age;
  40.         this.sex = sex;
  41.         this.school = school;
  42.         this.grade = grade;
  43.     }
  44.     public String getName() {
  45.         return name;
  46.     }
  47.     public void setName(String name) {
  48.         this.name = name;
  49.     }
  50.     public String getAge() {
  51.         return age;
  52.     }
  53.     public void setAge(String age) {
  54.         this.age = age;
  55.     }
  56.     public boolean isSex() {
  57.         return sex;
  58.     }
  59.     public void setSex(boolean sex) {
  60.         this.sex = sex;
  61.     }
  62.     public String getSchool() {
  63.         return school;
  64.     }
  65.     public void setSchool(String school) {
  66.         this.school = school;
  67.     }
  68.     @Override
  69.     public String toString() {
  70.         StringBuffer buffer = new StringBuffer();
  71.         if(name!=null&&name.length()>0)
  72.             buffer.append("My name is " + name + ".");
  73.         if(age!=null&&age.length()>0)
  74.             buffer.append("I'm " + age + " years old.");
  75.         buffer.append("I'm a " + (sex?"boy.":"girl."));
  76.         if(school!=null&&school.length()>0)
  77.             buffer.append("I'm study in " + school + ".");
  78.         if(grade>0)
  79.             buffer.append("I've got a grade of " + grade + " in the exam this time.");
  80.         return buffer.toString();
  81.     }
  82.     
  83.     public static void eat(){
  84.         System.out.println("I'm eating.");
  85.     }
  86.     public int getGrade() {
  87.         return grade;
  88.     }
  89.     public void setGrade(int grade) {
  90.         this.grade = grade;
  91.     }
  92. }
通过测试,
  1. Person pp = (Person) this.reflectInto.newInstance("com.company.code.Person"new Object[]{"gexing","20",false,"CUG",85});
  2.         System.out.println(pp.toString());

发现获得的实例对象为空。

Debug调试后发现,false获得的class是class java.lang.Boolean,85获得的class是class java.lang.Integer。

原来false和85作为基本类型获得的class是它们的包装类,这样就只能把构造函数中的boolean改为Boolean,int改为Integer,测试果然通过。

这样看来,在构造函数中用包装类代替基本类型,是不是会另程序更稳定呢?


版权声明:本文为applerao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。