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<?> を使用して宣言された_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.