gpt4 book ai didi

java - 从类外替换 setter/getter

转载 作者:行者123 更新时间:2023-11-29 08:25:29 25 4
gpt4 key购买 nike

所以,假设我有一个名为 Users 的类,它有一个名为 name 的私有(private)变量和一个只返回 name 变量的公共(public) getter 方法,我怎样才能让 getter 为所有实例返回 name + "test"类而不访问用户类?

最佳答案

在 Java 中有几种方法可以做到这一点......

子类

首先,您可以像这样扩展您的 Users 类并覆盖 getter 方法:

public class TestUser extends User {
@Override
public String getName() { return super.getName() + "test"; }
}

然后您可以通过 User 类引用 TestUser 实例并调用 getName 方法来使用新行为:

用户 tu = new TestUser("username");
tu.getName();//应该返回“用户名测试”

动态代理

现在...如果由于某种原因无法扩展您的类并且无法触及现有的 User 类,那么另一种方法是使用 proxy via reflection :

例如,如果您的 User 类实现了一个名为 IUser 的接口(interface)(或任何其他接口(interface)),该接口(interface)声明了一个 String getName() 方法>

public interface IUser {
String getName();
}

然后使用动态代理,您可以创建一个实现 InvocationHandler 的 IUser 代理,它将拦截 getName 方法并改变它的返回值。

public class DebugProxy implements java.lang.reflect.InvocationHandler {
private Object obj;

public static Object newInstance(Object obj) {
return java.lang.reflect.Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new DebugProxy(obj));
}

private DebugProxy(Object obj) {
this.obj = obj;
}

public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Object result;
try {
result = m.invoke(obj, args);
if ("getName".equals(m.getName())) {
return result + "test";
}
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: " + e.getMessage());
}
return result;
}
}

然后你就可以申请了:

public class MainApp {
public static void main(String[] args) {
IUser userProxy = (IUser) DebugProxy.newInstance(new User("foo"));
System.out.println(userProxy.getName());
}
}

System.out.println 将打印“footest”

这是一个丑陋的解决方案,只有当您的 User 类实现了一个公开 getName 方法的接口(interface)时才有效。唯一的好处是您不需要继承,也不需要更改 User 类代码:

我会说继承是要走的路。

希望这对您有所帮助,欢迎来到 stack overflow!

关于java - 从类外替换 setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53574187/

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