2016-05-18 43 views
3

这是一个跟进这个问题:Create new class from a Variable in Java创建和使用类从变量

我想加载基于字符串变量,它的工作原理一类,但我不能把它的任何方法。

我有多个类都实现相同的接口,例如,

class Foo implements Bar { 
    private String username = null; 

    public String getUsername() { 
     return this.username; 
    } 
} 

现在我想将类实例不知道哪一个是,然后调用getUsername()就可以了。

String a = "Foo"; 
Class<?> c = Class.forName(a); 
Object object = c.newInstance(); 
System.out.println(object.getUsername()); 

这导致

Error:(74, 15) java: cannot find symbol

symbol: method getUser()

location: variable object of type java.lang.Object

如果我将它转换为类像

Foo foo = (Foo) object; 

它的工作原理,但我不能这样做,因为我不知道班级' 名称。

有没有办法做到这一点或完全是一个虚假的尝试?

+1

你怎么知道getUsername()应该存在?它是来自一个接口或抽象类,你知道你的实例将实现/扩展? – AxelH

+0

是的,这是众所周知的,因为它们都实现了一个接口@AxelH – baao

+0

如果你不能通过'c.newinstance()'来检索你检索的对象,那么你必须使用反射来获取getUsername()方法。 – Turing85

回答

3

你应该把它投放到您的接口:Bar object = (Bar) c.newInstance()

+0

你现在不是课程名称。但你必须现在你的界面。没有这个,你不能调用任何方法。 – Nikem

2

只是要多一点安全,可以检查,如果转换是可能的。

public static void main(String arg[]) throws Exception { 
    String a = "Test"; 
    Class<?> c = Class.forName(a); 
    if(ITest.class.isAssignableFrom(c)){ 
     ITest object = (ITest) c.newInstance(); 
     System.out.println(object.sayHello()); 
    } else { 
     System.out.println("Good bye"); 
    } 
} 

接口为:

public interface ITest { 
    public String sayHello(); 
} 

和类是:

public class Test implements ITest{ 

    @Override 
    public String sayHello(){ 
     return "Hello World"; 
    } 
} 

这将检查如果转换是可能通过检查生成的类是与具有层次链接界面。这可以用try catch来完成,但是这样更漂亮;)