如果不應該訪問繼承的方法,也許應該使用聚合而不是繼承?
由於任何代碼都可以調用該對象上的公共繼承方法,因此這不是特定於spring的。
編輯:當你發現自己,遠程處理框架可以配置爲不公開所有方法。如果這種情況是不可能的,你也可以使用:
import java.lang.reflect.Proxy;
public static <I> I restrictToInterface(final I instance, Class<I> publicInterface) {
Object proxy = Proxy.newProxyInstance(
publicInterface.getClassLoader(),
new Class<?>[] {publicInterface},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(instance, args);
}
}
);
return publicInterface.cast(proxy);
}
測試代碼:
interface MyRemoteInterface {
void foo(Object bar);
}
class MyBeanImpl implements MyRemoteInterface {
@Override
public void foo(Object bar) {
System.out.println(bar);
}
public void dangerousMethodThatMustNotBeInvoked() {
// launch missiles
}
}
public static void main(String[] args) {
MyBeanImpl beanImpl = new MyBeanImpl();
MyRemoteInterface remotableBean = restrictToInterface(beanImpl, MyRemoteInterface.class);
System.out.println("Remoteable Methods are:");
for (Method m : remotableBean.getClass().getMethods()) {
if (!Modifier.isStatic(m.getModifiers())) {
System.out.println("\t" + m.getName());
}
}
remotableBean.foo("Hello world!");
}
有可用的一個解決方案中使用AspectJ http://forum.springsource.org/archive/index.php/t-32469.html 但似乎過於複雜。必須有更好的解決方案。 – Worker 2010-06-26 19:28:50