正在尝试拦截jdbcOperations并使用字节伙伴返回固定值



我正试图使用byte buddy和spring来拦截对JdbcOperations的调用。

我有两节课。

Application.java

@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception{
premain(null, ByteBuddyAgent.install());
SpringApplication.run(Application.class, args);
}

public static void premain(String arg, Instrumentation instrumentation) throws Exception {
new AgentBuilder.Default()
.type(ElementMatchers.is(JdbcOperations.class))
.transform(new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {
return builder.method(named("queryForList"))
.intercept(FixedValue.value(Collections.emptyList()));
}
}).installOn(instrumentation);
}
} 

DemoRunner.java

@Component
public class DemoRunner implements CommandLineRunner {
private final JdbcOperations jdbcOperations;
public DemoRunner(JdbcOperations jdbcOperations) {
this.jdbcOperations = jdbcOperations;
}

@Override
public void run(String... args) throws Exception {
List<Map<String,Object>> resultSet = jdbcOperations.queryForList("SELECT * FROM COUNTRY");
for(Map<String, Object> result : resultSet) {
System.out.println(result);
}
}
}

我可以看到代码在运行,但它并没有像我预期的那样返回固定值。有人知道我哪里出了问题吗?

使用ElementMatchers.is(JdbcOperations.class),您正在加载JdbcOperations类。如果不重新转换格式,则不会检测此类,因为在安装代理时已经加载了该类。

而是使用ElementMatchers.named("pkg.of.JdbcOperations")

最新更新