Java反射机制demo(二)—通过Class实例化任意类的对象

Java反射机制demo(二)—通过Class实例化任意类的对象

上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例。

任意一个类,UserInfo,

 package com.aaron.reflect;

 public class UserInfo{
private int userId;
private String name;
private int age; public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo [userId=" + userId + ", name=" + name + ", age=" + age + "]";
} }
 

 使用newInstance方法,通过调用默认的无参构造来实例化一个UserInfo的对象

 package com.aaron.reflect;

 public class Demo1 {
public static void main(String[] args) {
Class<?> c = UserInfo.class;//获得Class类实例
UserInfo userInfo = null; try {
userInfo = (UserInfo) c.newInstance();//通过Class类的实例获得UserInfo的实例
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} userInfo.setUserId(1);
userInfo.setName("Squee,Spleen and Goblin");
userInfo.setAge(10); System.out.println(userInfo);
}
}
 

 如果了解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.UserInfo
at java.lang.Class.newInstance(Class.java:359)
at com.aaron.reflect.Demo1.main(Demo1.java:9)
Exception in thread "main" java.lang.NullPointerException
at com.aaron.reflect.Demo1.main(Demo1.java:16

此时,要定义一个空的构造函数(显式地声明一个空的构造函数)。 

所以,显式声明空的构造函数有时候也是一种很好的习惯。当你要使用反射时,一定不要忘记空的构造。

上一篇:awk 实用技巧


下一篇:命令别名设置: alias, unalias