Java使用动态加载类创建实例化对象

Java创建实例化对象

背景

通过动态加载,创建一个Person类的实例化对象
以下对问题过程进行了描述,解决方案放在了最后
请参见最终解决方案一节。

import java.lang.reflect.Constructor;

public class Person {
    
    
    String name;
    int age;
    Person(String name,int age){
    
    
        this.name=name;
        this.age=age;
    }
    Person(){
    
    
        name=null;
        age=0;
    }
    public void introduceMe(){
    
    
        System.out.println("My name is "+this.name+","+this.age+" years old.");

    }
    public static void main(String[] args)  {
    
    
        try{
    
    
          Person p =( Person) Class.forName("Person").newInstance();
            p.introduceMe();
        }catch(Exception e){
    
    
            System.out.println(e);
        }

    }
}

问题描述

问题1:

注:Person.java使用或覆盖了已过时的 API。
注:有关详细信息, 请使用 -Xlint:deprecation 重新编译。
使用或覆盖了已过时的API

原因分析:

Class.forName("类名").newInstance();

从JDK1.9版本开始弃用,应该使用

 Class.forName().getDeclaredConstructor().newInstance();

来代替

解决方案:

            Class clazz = Class.forName("Person");
            Constructor declared_con = clazz.getDeclaredConstructor(String.class,int.class);
            Person p = (Person)declared_con.newInstance("LiSi",30);

问题2:

经过修改之后,又出现了新的问题:
注: Person.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

使用了未经检查或不安全的操作

原因分析:

这个警告信息是Java编译器提供的,它表示在编译Java代码时,使用了未经检查的类型转换或泛型类型操作。

最终解决方案:


要消除这个警告信息,你可以在声明 clazz 和 declared_con 变量时使用泛型类型。
你想要使用反射来创建 Person 类的实例,但你不知道要使用哪个构造函数。因此,你可以使用 getDeclaredConstructor() 方法来获取 Person 类的构造函数。
由于你不知道使用哪个构造函数,因此你可以使用泛型类型 Constructor<?> 来声明 declared_con 变量

            Class<?> clazz = Class.forName("Person");
            Constructor<?> declared_con = clazz.getDeclaredConstructor(String.class,int.class);
            Person p = (Person)declared_con.newInstance("LiSi",30);

运行结果:

My name is LiSi,30 years old.

猜你喜欢

转载自blog.csdn.net/Rm_mR/article/details/129763394