2015-11-20 54 views
3

存在我使用这样的构造函数映射Hibernate查询到的对象:检查构造器在编译时

Constructor<Product> contructor = Product.class.getConstructor(String.class, String.class, Integer.class, String.class, String.class, String.class, 
         String.class,String.class, String.class,Boolean.class); 
criteria.setResultTransformer(new AliasToBeanConstructorResultTransformer(contructor)); 

如果有人通过添加参数修改构造函数,这个代码将会失败,但在运行时。有可能在编译时确保我们在这里需要的构造器是存在的吗?

+1

你将不得不修改编译器的编译时分析,所以不,我不认为有办法。但是,您可以使用[工厂方法模式](https://en.wikipedia.org/wiki/Factory_method_pattern#Java),并通过定义一个接口并使工厂级别与相应的参数一起强化工厂方法的存在实现那个接口(但是这只能解决问题......如果有人改变了接口定义呢......)。 – Turing85

+0

我不认为这是可能的。你可以尽快检查一下(在主类的静态块中)。 –

+0

如果你使用AliasToBeanResultTransformer – MarianP

回答

1

这基本上是测试的目的。

例如:

@Test 
public void constructorAvailableTest() { 

    try { 
     Constructor<Product> contructor = Product.class.getConstructor(String.class, String.class, Integer.class, String.class, String.class, String.class, 
      String.class,String.class, String.class,Boolean.class); 
    } catch(NoSuchMethodException nsme) { 
     fail("The specified " + Product.class.getName() + " constructor does not exist!"); 
    } 

} 

更重要的是,你可以把那个本能地构建产品在静态方法的代码,只是调用,在您的测试!

+0

它可能会帮助他也可以直接测试hibernate代码 –

+0

@RC如何?他不想测试自己的代码,而不是冬眠的? – Marco

+0

我的意思是他发布的代码片段 –