官網Arbitrary Method Replacement
個人認爲的使用場景:之前的方法不能修改了,所以要替換原來的方法
使用示例
- MyValueCalculator.java(因爲這個類的 computeValue 方法被替換了,所以computeValue 方法根本就沒有執行)
public class MyValueCalculator {
public String computeValue(String input) {
System.out.println("MyValueCalculator computeValue");
return input;
}
}
- ReplacementComputeValue.java
import org.springframework.beans.factory.support.MethodReplacer;
import java.lang.reflect.Method;
public class ReplacementComputeValue implements MethodReplacer {
/**
* 重新實現給定的方法。
* 得到輸入值,用它工作,然後返回一個計算後的結果
* @param o 我們重新實現方法的實例
* @param m 重新實現的方法
* @param args 方法的參數
* @return 這個方法的結果
* @throws Throwable
*/
public Object reimplement(Object o, Method m, Object[] args) throws Throwable {
System.out.println(o.getClass()); // class org.example.mavenjavademo.spring.MyValueCalculator$$EnhancerBySpringCGLIB$$af2fa846
System.out.println(m.getName()); // computeValue
System.out.println(args[0]); // 你好
String input = args[0] + "天蒼蒼野茫茫";
return input; // 你好天蒼蒼野茫茫
}
}
- config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"
>
<bean id="myValueCalculator" class="org.example.mavenjavademo.spring.MyValueCalculator">
<!-- 替換任意一個方法 -->
<replaced-method name="computeValue" replacer="replacementComputeValue">
<arg-type>String</arg-type>
</replaced-method>
</bean>
<bean id="replacementComputeValue" class="org.example.mavenjavademo.spring.ReplacementComputeValue"/>
</beans>
- SpringMain.java
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
MyValueCalculator bean = context.getBean(MyValueCalculator.class);
System.out.println(bean.computeValue("你好"));
}
}