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

Dynamically retrive the java object of Object class to a given class when class name is known

MyInterface.java

publc interface MyInterface{
   void print();
}

Abc.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);
}
}

这里的主要方法 class路径是 "Abc",所以我期待 Abc 实例。 classsPath 字符串将是 Abc 或 Xyz 或实现 MyInterface.So 的任何 Class 名称,具体取决于 class 路径字符串我想要 class 的实例。就像如果 ClassPath 是 "Abc" 那么 Abc Class 实例,ClassPath 是 "Xyz" 那么 Xyz Class 实例。 我怎样才能动态地实现这个。

我在您的 post 中看到一些拼写错误,所以让我们先修正这些错误。 publicclass 喜欢

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();
    }
}

你需要知道调用什么构造函数。

假设你所有的 类 都有一个无参数的构造函数,而你想要那个:

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

如果构造函数具有不同的签名,您需要提供它,例如使用单个 String 参数:

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

newInstance Class 的方法用于创建新实例。

 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
 }

您可以在运行时使用 class 的名称动态创建对象,输入为简单字符串。这是使用称为反射的 Java 语言的一部分完成的。 反射允许旧代码调用新代码,而无需重新编译。 如果 class 具有无参数构造函数,则通常使用以下方法从其包限定的 class 名称(例如,"java.lang.Integer")创建对象:

Class.forName Class.newInstance 如果需要将参数传递给构造函数,则可以使用这些替代方法:

Class.getConstructor Constructor.newInstance 反射最常见的用途是实例化一个 class ,其泛型类型在设计时已知,但其具体实现 class 未知。有关示例,请参见插件主题。反射的其他用途相当少见,主要出现在特殊用途的程序中。