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 类表示的是构造方法:

JAVA类怎么搞 java类怎么使用_Class 类的使用

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);
    }
}

程序中通过 Class 类取得了一个类中的全部构造方法,并以对象数组的形式返回。

同时在声明对象数组时,必须考虑到构造方法中参数的类型顺序,所以第一个参数的类型为 String,第二个参数的类型为 Integer。

相比无参构造,有参构造相对复杂