当 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 中看到一些拼写错误,所以让我们先修正这些错误。 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();
}
}
你需要知道调用什么构造函数。
假设你所有的 类 都有一个无参数的构造函数,而你想要那个:
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 未知。有关示例,请参见插件主题。反射的其他用途相当少见,主要出现在特殊用途的程序中。
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 中看到一些拼写错误,所以让我们先修正这些错误。 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();
}
}
你需要知道调用什么构造函数。
假设你所有的 类 都有一个无参数的构造函数,而你想要那个:
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 未知。有关示例,请参见插件主题。反射的其他用途相当少见,主要出现在特殊用途的程序中。