当类名已知时,动态地将对象类的java对象检索到给定的类
MyInterface.java当类名已知时,动态地将对象类的java对象检索到给定的类,java,class,object,Java,Class,Object,MyInterface.java publc interface MyInterface{ void print(); } java public Class Abc implements MyInterface{ public void print(){ System.out.print("Inside Abc"); } } Xyz.java public Class Xyz implements MyInterface{
publc interface MyInterface{
void print();
}
java
public Class Abc implements MyInterface{
public void print(){
System.out.print("Inside Abc");
}
}
Xyz.java
public Class Xyz implements MyInterface{
public void print(){
System.out.print("Inside Xyz");
}
}
Main.java
public Class Main{
public static void main(String arg[]){
String classPath="Abc"; // this String will get assign @ runtime.
Class<?> s = Class.forName(classPath);
}
}
公共类主{
公共静态void main(字符串arg[]){
String classPath=“Abc”;//此字符串将获得assign@runtime。
Class s=Class.forName(类路径);
}
}
这里的主方法类路径内部是“Abc”,所以我期待Abc实例。
classsPath字符串将是Abc或Xyz或实现MyInterface的任何类名。因此,根据类路径字符串,我需要该类的实例。比如,如果类路径是“Abc”,那么Abc类实例,类路径是“Xyz”,那么Xyz类实例。
我怎样才能动态地做到这一点。我在你的帖子中看到一些拼写错误,所以让我们先修复它们<代码>公共和
类
类似
public interface MyInterface {
void print();
}
public class Abc implements MyInterface {
public void print() {
System.out.print("Inside Abc");
}
}
然后使用Class.newInstance()
创建一个对象
,用instanceof
检查它是否是预期的类型,然后像
public static void main(String[] args) {
try {
Class<?> cls = Class.forName("Abc");
Object o = cls.newInstance();
if (o instanceof MyInterface) {
MyInterface m = (MyInterface) o;
m.print();
}
} catch (Exception e) {
e.printStackTrace();
}
}
publicstaticvoidmain(字符串[]args){
试一试{
类别cls=类别forName(“Abc”);
对象o=cls.newInstance();
if(MyInterface的o实例){
MyInterface m=(MyInterface)o;
m、 打印();
}
}捕获(例外e){
e、 printStackTrace();
}
}
您需要知道调用什么构造函数
假设您的所有类都有一个无参数构造函数,并且您希望使用该构造函数:
MyInterface instance = (MyInterface) s.newInstance();
如果构造函数具有不同的签名,则需要提供该签名,例如,使用单个字符串参数:
MyInterface instance = (MyInterface) s
.getConstructor(String.class)
.newInstance("foo");
类的newInstance方法用于创建新实例
public static void main(String arg[]){
String classPath="Abc"; // this String will get assign @ runtime.
Class s = Class.forName(classPath);
Object object = s.newInstance();// to create new Instance
}
您可以在运行时使用类的名称(输入为简单字符串)动态创建对象。这是使用Java语言中称为反射的一部分来完成的。 反射允许旧代码调用新代码,而无需重新编译。 如果类具有无参数构造函数,则通常使用以下方法从其包限定类名(例如,“java.lang.Integer”)创建对象: Class.forName Class.newInstance 如果需要将参数传递给构造函数,则可以使用以下替代方法: Class.getConstructor 构造函数。newInstance 反射最常见的用途是实例化一个类,该类的泛型类型在设计时已知,但其特定的实现类却未知。有关示例,请参见插件主题。反射的其他用途相当罕见,并且大多出现在专用程序中