我有一个任务,我必须实现创建给定类的对象的方法。
class Paper {}
class Bakery {}
class Cake extends Bakery {}
class ReflexiveBaker {
/**
* Create bakery of the provided class.
*
* @param order class of bakery to create
* @return bakery object
*/
public Object bake(Class order) {
// Add implementation here
}
}
我应该如何正确实现此方法?我想以这种方式做到这一点
public <T extends Bakery> T bake(Class<T> order) {
try {
return order.getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
}
但是它总是抛出NoSuchMethodException。此外,从任务``确保Bakery的所有子类都将具有公共无参数构造函数''。而且InvocationTargetException没有导入到任务中,因此应在没有任务的情况下实现。有什么问题?
这是怎么做的。你必须用getDeclaredConstructor()
class Paper {
}
class Bakery {
}
class Cake extends Bakery {
}
class ReflexiveBaker {
/**
* Create bakery of the provided class.
*
* @param order class of bakery to create
* @return bakery object
*/
public static <T extends Bakery> T bake(Class<T> order) {
try {
return order.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException("Failed to instantiate class of type " + order, e);
}
}
}
用法
public static void main(String[] args) {
Cake cake = ReflexiveBaker.bake(Cake.class);
System.out.println(cake.getClass());
}
发问者写道:“确保Bakery的所有子类都将具有公共无参数构造函数”,但是这些类不是公共的,因此默认构造函数也将是非公共的。对于真正的公共构造函数,作为“保证”,您可以使用
getConstructor()
代替getDeclaredConstructor()
。但是此解决方案最令人讨厌的方面是问题的代码已经使用getDeclaredConstructor()
,因此您无需实际更改即可解决问题。用catch
通用代替合格品catch(Exception e)
并不能改善。@Holger我的答案已在作者更改其代码之前发布。评论前请仔细阅读评论
该问题从未编辑过。
@Holger这是评论:但是,我只是解决了这个问题。添加了引发ReflectiveOperationException并将更改的实现更改为“ return order.getDeclaredConstructor()。newInstance();”)–昨天qwoke
而且问题没有“引发ReflectiveOperationException”。而且显然它从未被编辑过。换句话说,您甚至没有阅读问题,只是在评论中找到了明显的解决方案,然后将其重新发布为答案,而无需重新检查?无需进一步讨论...