当类名已知时,动态地将object class的java对象检索到给定的类

ac1kyiln  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(287)

我的接口.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{
          public void print(){
         System.out.print("Inside Xyz");
     }
}

主.java

public Class Main{

public static void main(String arg[]){

  String classPath="Abc"; // this String will get assign @ runtime.
  Class<?> s = Class.forName(classPath);
}
}

这里的main方法类路径是“”,所以我需要示例。classspath字符串将是或xyz或实现myinterface的任何类名。因此,根据classpath字符串,我需要该类的示例。例如,如果classpath是“”,那么类示例,classpath是“xyz”,那么xyz类示例。如何动态地实现这一点。

s71maibg

s71maibg1#

类的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
 }
x9ybnkn6

x9ybnkn62#

您可以在运行时使用类名动态创建对象,输入为简单字符串。这是使用java语言中称为反射的一部分来完成的。反射允许旧代码调用新代码,而不需要重新编译。如果类具有无参数构造函数,则通常使用以下方法从其包限定类名(例如,“java.lang.integer”)创建对象:
class.forname class.newinstance如果需要将参数传递给构造函数,则可以使用以下替代方法:
反射最常用的用法是示例化一个类,该类的泛型类型在设计时已知,但其特定的实现类在设计时未知。有关示例,请参见插件主题。反射的其他用法相当少见,而且大多出现在专用程序中。

7cjasjjr

7cjasjjr3#

你需要知道调用什么构造函数。
假设您的所有类都有一个无参数构造函数,并且您需要该构造函数:

MyInterface instance =  (MyInterface) s.newInstance();

如果构造函数具有不同的签名,则需要提供该签名,例如使用单个字符串参数:

MyInterface instance = (MyInterface) s
              .getConstructor(String.class)
              .newInstance("foo");
ubby3x7f

ubby3x7f4#

我在你的帖子里看到了一些拼写错误,所以让我们先来纠正一下。 public 以及 class 喜欢

public interface MyInterface {
    void print();
}

public class Abc implements MyInterface {
    public void print() {
        System.out.print("Inside Abc");
    }
}

然后你用 Class.newInstance() 创建 Object ,检查它是否为预期的类型 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();
    }
}

相关问题