Java反射机制demo(二)—通过Class实例化任意类的对象
上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例。
任意一个类,UserInfo,
1 package com.aaron.reflect; 2 3 public class UserInfo{ 4 private int userId; 5 private String name; 6 private int age; 7 8 public int getUserId() { 9 return userId;10 }11 public void setUserId(int userId) {12 this.userId = userId;13 }14 public String getName() {15 return name;16 }17 public void setName(String name) {18 this.name = name;19 }20 public int getAge() {21 return age;22 }23 public void setAge(int age) {24 this.age = age;25 }26 @Override27 public String toString() {28 return "UserInfo [userId=" + userId + ", name=" + name + ", age=" + age + "]";29 }30 31 }32
使用newInstance方法,通过调用默认的无参构造来实例化一个UserInfo的对象
1 package com.aaron.reflect; 2 3 public class Demo1 { 4 public static void main(String[] args) { 5 Class c = UserInfo.class;//获得Class类实例 6 UserInfo userInfo = null; 7 8 try { 9 userInfo = (UserInfo) c.newInstance();//通过Class类的实例获得UserInfo的实例10 } catch (InstantiationException e) {11 e.printStackTrace();12 } catch (IllegalAccessException e) {13 e.printStackTrace();14 }15 16 userInfo.setUserId(1);17 userInfo.setName("Squee,Spleen and Goblin");18 userInfo.setAge(10);19 20 System.out.println(userInfo);21 }22 }23
如果了解Java虚拟机,应该知道,一个对象在new之前,堆里是不会分配内存的。因此这个UserInfo的实例是通过Class的实例得到的。
运行结果:
UserInfo [userId=1, name=Squee,Spleen and Goblin, age=10]
注意事项:
newInstance()调用的是无参的空构造,如果只有参数的构造函数:如下:
private int userId;private String name;private int age; public UserInfo(int userId, String name, int age) { super(); this.userId = userId; this.name = name; this.age = age;}
运行Demo,抛出异常:
java.lang.InstantiationException: com.aaron.reflect.UserInfoat java.lang.Class.newInstance(Class.java:359)at com.aaron.reflect.Demo1.main(Demo1.java:9)Exception in thread "main" java.lang.NullPointerExceptionat com.aaron.reflect.Demo1.main(Demo1.java:16
此时,要定义一个空的构造函数(显式地声明一个空的构造函数)。
所以,显式声明空的构造函数有时候也是一种很好的习惯。当你要使用反射时,一定不要忘记空的构造。