通过新实例访问类

时间:2015-05-26 08:06:49

标签: java

我使用上面的代码从类中创建一个新对象:

Object obj = Class.forName("myClass").newInstance()

但出于某种原因,我不能使用var obj来执行方法或从类' myClass'中获取变量,如下所示:

obj.methodFromMyClass();

这一点是从类' myClass'动态创建一个对象。通过另一个班级的参数。

A

public A () {

    B b = new B("myClass"); 

}

班级 B

public B ( String className ) {

    Object obj = Class.forName( className ).newInstance(); 
    obj.methodFromMyClass(); 

}

Class myClass

public void methodFromMyClass () {

    // Some code

}

因此,B类应该像桥梁一样在指定的类中创建对象。

欢迎每一个提示。

2 个答案:

答案 0 :(得分:3)

您需要cast objmyClass,以便编译器知道它是什么类型的对象:

((myClass) obj).methodFromMyClass();

如果要在myClass上反复使用obj中的方法,您可能希望将其分配给显式声明该类的新变量:

myClass myObj = (myClass) myObj;
myObj.aMethodFromMyClass();
myObj.anotherMethodFromMyClass();

如果您在编译时不知道obj的类型,则可能需要使用reflection来呼叫methodFromMyClass,例如

obj.getClass().getMethod("methodFromMyClass", new Object[0]).invoke(obj);

答案 1 :(得分:1)

您需要将obj投射到您班级的类型:

myClass obj = (myClass) Class.forName( className ).newInstance(); 
obj.methodFromMyClass(); 

由于您的B类构造函数调用方法methodFromMyClass,因此它必须知道要将obj转换为哪种类型。该类型必须具有methodFromMyClass方法。它不必是所创建实例的确切类型。创建的实例的类实现/扩展的任何接口或超类都可以,只要它们包含该方法。