通过Class类获取对象实例

通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象。

 1 /**
 2  * Created by hunt on 2017/6/27.
 3  * 测试的实体类
 4  * @Data 编译后会自动生成set、get、无惨构造、equals、canEqual、hashCode、toString方法
 5  */
 6 @Data
 7 public class Person {
 8     private String name;
 9     private int age;
10 }

 

 1 /**
 2  * Created by hunt on 2017/6/27.
 3  */
 4 public class NewInstanceTest {
 5     public static void main(String[] args) {
 6         Class<Person> personClass = Person.class;//获取Class实例
 7         try {
 8             Person p = personClass.newInstance();//通过Class获得Person实例
 9             p.setAge(28);
10             p.setName("hunt");
11             System.out.println(p);
12         } catch (InstantiationException e) {
13             e.printStackTrace();
14         } catch (IllegalAccessException e) {
15             e.printStackTrace();
16         }
17     }
18 }

提示:class.newInstance()是通过无参构造函数实例化的,一个对象默认是有一个无参构造函数,如果有一个有参构造函数,无参构造函数就不存在了,在通过反射获得对象会抛出 java.lang.InstantiationException 异常。

 1 /**
 2  * Created by hunt on 2017/6/27.
 3  * 测试的实体类
 4  */
 5 
 6 public class Person {
 7     private String name;
 8     private int age;
 9 
10     public String getName() {
11         return name;
12     }
13 
14     public int getAge() {
15         return age;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public void setAge(int age) {
23         this.age = age;
24     }
25 
26     public Person(String name,int age){}//有参数构造函数
27 }
 1 /**
 2  * Created by hunt on 2017/6/27.
 3  */
 4 public class NewInstanceTest {
 5     public static void main(String[] args) {
 6         Class<Person> personClass = Person.class;//获取Class实例
 7         try {
 8             Person p = personClass.newInstance();//通过Class获得Person实例
 9             p.setAge(28);
10             p.setName("hunt");
11             System.out.println(p.getAge()+"----"+p.getName());
12         } catch (InstantiationException e) {
13             e.printStackTrace();
14         } catch (IllegalAccessException e) {
15             e.printStackTrace();
16         }
17     }
18 }

总结:以后创建实体类的时候一定要带上无参构造函数,以便以后使用反射的时候实例化对象不抛出异常。

 

posted on 2017-06-27 19:34  默默红尘  阅读(8655)  评论(0编辑  收藏  举报

导航