Arbitrary Method Replacement;replaced-method

官網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("你好"));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章