Class 类在开发中最常见的用法就是实例化对象的操作,即可以通过一个给定的字符串(此字符串包含了完整的“包.类
” 的路径)来实例化一个类的对象
一、通过无参构造实例化对象
如果要想通过 Class 类本身实例化其他类的对象,则可以使用 newInstance()
方法,但是必须要保证被实例化的类中存在一个无参构造方法:
class Person{
private String name;
private int age;
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;
}
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
public class Test{
public static void main(String[] args) {
Class<?> c = null;//指定泛型
try{
c = Class.forName("Person");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
Person per = null;
try {
per = (Person) c.newInstance();//实例化Person对象
}catch (Exception e){
e.printStackTrace();
}
per.setName("Java");
per.setAge(20);
System.out.println(per);
}
}
这里需要注意此时被实例化的类(Person)必须存在无参构造方法,否则将会出错
需要注意各种高级应用中都提倡类中存在无参构造方法
二、调用有参构造实例化对象
有参构造必须通过以下步骤获取实例化对象
也可以在操作时明确地调用类中的构造方法,并将参数传递进去之后才可以进行实例化操作:
(1)通过 Class 类中的 getConstructors()
取得本类中的全部构造方法。
(2)向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。
(3)之后通过 Constructor 实例化对象
这里的 Constructor 类表示的是构造方法:
import java.lang.reflect.Constructor;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.setName(name);
this.setAge(age);
}
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;
}
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
public class Test{
public static void main(String[] args) {
Class<?> c = null;//指定泛型
try{
c = Class.forName("Person");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
Person per = null;
Constructor<?> cons[] = null;//声明一个表示构造方法的数组
cons = c.getConstructors();//通过反射取得全部构造
try {//向构造方法中传递参数,此方法使用可变参数接收,并实例化对象
per = (Person) cons[0].newInstance("Java",20);//实例化Person对象
}catch (Exception e){
e.printStackTrace();
}
System.out.println(per);
}
}
- 44
- 45
- 46
- 47
- 48
程序中通过 Class 类取得了一个类中的全部构造方法,并以对象数组的形式返回。
同时在声明对象数组时,必须考虑到构造方法中参数的类型顺序,所以第一个参数的类型为 String,第二个参数的类型为 Integer。
相比无参构造,有参构造相对复杂