一篇文章带你搞定 Java 中 Class 类的使用

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

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

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值