关键词搜索

源码搜索 ×
×

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

发布2020-02-21浏览529次

详情内容

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。

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

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载