1、场景举例
有一个jar包中的类A,其中有一个方法getName()我想要改成自己的处理逻辑,但是这个方法在jar包中的其他方法也有被调用过。
2、原有代码示例
public interface AA {
String getName();
}
public class A implements AA{
@Override
public String getName() {
return "A";
}
}
3、处理办法
3.1 定义公共的自定义处理逻辑
public class MethodReplacerHandler implements InvocationHandler {
private final Object target;
private final Map<String, MethodLogic> methodLogicMap;
public MethodReplacerHandler(Object target, Map<String, MethodLogic> methodLogicMap) {
this.target = target;
this.methodLogicMap = methodLogicMap;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 查找对应方法的处理逻辑
MethodLogic logic = methodLogicMap.get(method.getName());
if (logic != null) {
return logic.apply(target,method, args); // 调用处理逻辑
}
return method.invoke(target, args); // 如果没有对应逻辑,正常调用目标方法
}
}
3.2 定义工厂用以构建目标对象
public class ProxyFactory {
public static Object createProxy(Object target, Map<String, MethodLogic> methodLogicMap) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new MethodReplacerHandler(target, methodLogicMap)
);
}
}
3.3 自定义处理逻辑的方法,具体需要自己去实现这个接口
public interface MethodLogic {
Object apply(Object target, Method method, Object[] args) throws Throwable;
}
4、使用
4.1 实现MethodLogic接口,自定义方法处理逻辑
public class AMethodLogic implements MethodLogic {
@Override
public Object apply(Object target, Method method, Object[] args) throws Throwable {
//.....省略100行处理逻辑
return "======AGetNameLogic的apply处理结果========";
}
}
4.2 调用
public class Demo {
public static void main(String[] args) {
A a = new A();
HashMap<String, MethodLogic> logicHashMap = new HashMap<>();
logicHashMap.put("getName", new AMethodLogic());
AA aa = (AA) ProxyFactory.createProxy(a, logicHashMap);
System.out.println(aa.getName());
}
}