So, dass ich nur noch Grupperungsklassen*3 + 1 (der Readonly-Wrapper) Dateien habe.
Ich hab jetzt eine für mich akzeptable Lösung gefunden. Eher durch Zufall bin ich darauf gestoßen:
public class ReadOnly implements InvocationHandler {
public static Object get(Class<?> iface, Class<?> makeReadOnly, Object object) {
return Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{iface}, new ReadOnly(object, makeReadOnly));
}
private final Class<?> makeReadOnly;
private final Object source;
public ReadOnly(Object source, Class<?> makeReadOnly) {
this.source = source;
this.makeReadOnly = makeReadOnly;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
if(methodName.toLowerCase().startsWith("set")) {
throw new UnsupportedOperationException();
}
else {
Method sourceMethod = source.getClass().getMethod(methodName, method.getParameterTypes());
Object result = sourceMethod.invoke(source, args);
if(makeReadOnly.isAssignableFrom(result.getClass())) {
Class<?> rcl = sourceMethod.getReturnType();
result = ReadOnly.get(rcl, makeReadOnly, result);
}
return result;
}
}
}
Das einzige was noch nicht wirklich passt, ich jetzt aber vernachlässige ist, dass man dann die set*-Funktionen trotzdem noch sieht:
public interface IConfig {}
public interface IProjectConfig extends IConfig {
public String getOwner();
public void setOwner(String owner);
public IManagers getManagers();
public void setManagers(IManagers managers);
}
public interface IManagers extends IConfig {/* ... */}
public class ProjectConfig implements IProjectConfig {
protected String owner;
protected IManagers managers;
public ProjectConfig() {/* ... */}
public ProjectConfig(String owner, IManagers managers) {/* ... */}
public String getOwner() {/* ... */}
public void setOwner(String owner) {/* ... */}
public IManagers getManagers() {/* ... */}
public void setManagers(IManagers managers) {/* ... */}
}
public class Managers implements IManagers {/* ... */}
Erzeugen kann ich das ganze dann ganz einfach mit:
IProjectConfig cfgRO = (IProjectConfig) ReadOnly.get(IProjectConfig.class, IConfig.class, new ProjectConfig());
Ob ich die set*-Funktionen noch irgendwie aus der IDE rausbekomme muss ich dann noch gucken.
MfG
bubble
--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye