这是对此问题的跟进:Create new class from a Variable in Java
我想基于一个有效的字符串变量加载一个类,但是我不能调用它的任何方法。
我有多个类都实现了相同的接口,例如
Meteor.publish('caja', function(skip, desde, hasta) {
if (desde == 'NA' & hasta == 'NA') {
return Cajas.find({}, {
skip: skip,
limit: 25,
sort: {
fecha: 1
}
});
} else if (hasta === 'NA') {
return Cajas.find({
fecha: {
$gte: new Date(desde)
}
}, {
skip: skip,
limit: 25,
sort: {
fecha: 1
}
});
} else {
return Cajas.find({
fecha: {
$gte: new Date(desde),
$lte: new Date(hasta)
}
}, {
skip: skip,
limit: 25,
sort: {
fecha: 1
}
});
}
});
现在我想在不知道它是哪一个的情况下实例化该类,然后在其上调用class Foo implements Bar {
private String username = null;
public String getUsername() {
return this.username;
}
}
。
getUsername()
这导致
错误:(74,15)java:找不到符号
symbol:方法getUser()
location:java.lang.Object类型的变量对象
如果我把它投到像
这样的班级String a = "Foo";
Class<?> c = Class.forName(a);
Object object = c.newInstance();
System.out.println(object.getUsername());
它有效,但我不能这样做,因为我不知道班级的名字。
有没有办法做到这一点,或者这完全是一次虚假的尝试?
答案 0 :(得分:3)
您应该将其投放到您的界面:.attr({
x1: function (d) { return d.coordinates.x1; },
x2: function (d) { return d.coordinates.x2; },
y1: function (d) { return d.coordinates.y1; },
y2: function (d) { return d.coordinates.y2; }
});
答案 1 :(得分: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完成,但这更漂亮;)
答案 2 :(得分:0)
您可以尝试使用类变量和您创建的实例来使用反射。
Method method = c.getMethod("getUsername");
method.invoke(object);