Один из способов решения этой проблемы - работать с интерфейсами и использовать отражение для создания прокси-объектов, которые обертывают реальный базовый объект.Что-то вроде:
interface IEntity
{
void setFoo(String foo);
String getFoo();
}
class WSEntity
{/* code generated by jax-ws */
}
class DataEntity
{ /* code generated by java, hibernate, .. */
}
class WSEntityInvocationHandler implements InvocationHandler
{
private final WSEntity entity;
public WSEntityInvocationHandler(WSEntity entity)
{
this.entity = entity;
}
public Object invoke(Object proxy,
Method method, Object[] args) throws Throwable
{
// this is a simplified version
Method m = entity.getClass().getMethod(method.getName(), params);
return m.invoke(entity, args);
}
}
static void example()
{
InvocationHandler handler = new WSEntityInvocationHandler(entity);
IEntity ie = (IEntity) Proxy
.newProxyInstance(IEntity.class.getClassLoader(),
new Class[]{IEntity.class},
handler);
}
По сути, все, что нужно вашему приложению, это решить, какой «обработчик вызова» использовать, например,
InvocationHandler handler = new WSEntityInvocationHandler(entity);
или
InvocationHandler handler = new DataEntityInvocationHandler(entity);