gpt4 book ai didi

java - 如何从 Spring bean 中隐藏方法?

转载 作者:行者123 更新时间:2023-11-30 06:37:42 26 4
gpt4 key购买 nike

我有一个扩展其他 Java 文件的 bean。当我创建一个 Spring bean 时,所有公共(public)方法(来 self 的和来自扩展文件的)都会被公开。我如何在 bean XML 配置中隐藏不需要的方法,以免暴露它们?

补充说明:

我通过 RDS 为 Flex 应用程序公开我的 beans。所以,我的 bean 可以通过网络获得。使用不需要的方法我有两个问题:

  1. 安全性 - 任何人都可以调用我从 JdbcDaoSupport 或其他任何地方继承的 setDataSource。我认为这太疯狂了:-)
  2. 因为我使用 RDS for Flex Builder,它会自动为我的 Flex 应用程序创建远程对象。 setDataSource 等所有方法都可以在我的 Flex 应用程序中使用。这不好。当然我可以切断它们,但第一点仍然存在。

最佳答案

如果不应访问继承的方法,也许您应该使用聚合而不是继承?

因为任何代码都可以调用该对象上的公共(public)继承方法,所以这不是 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!");
}

关于java - 如何从 Spring bean 中隐藏方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com