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 重新编译。
原因分析:
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.