我目前正在尝试使用ByteBuddy作为java bean实现包装键/值对的java.util.Map
,将map键公开为普通getter/setter。
我最初按照如下方式构造生成器,允许我将映射作为构造函数参数传递:
DynamicType.Builder builder = new ByteBuddy()
.subclass( Object.class )
.name( customClassName )
.implement( Serializable.class )
.defineField( "theMap", Map.class )
.defineConstructor( Modifier.PUBLIC )
.withParameters( Map.class )
.intercept(
MethodCall.invoke( Object.class.getConstructor() ).onSuper()
.andThen( FieldAccessor.ofField( "theMap" ).setArgumentAt( 0 ) ) );
我不确定的是如何定义相关的getter/setter方法,以便它们有效地复制这种行为:
public Integer getFoo() {
return theMap.get( "foo" );
}
public void setFoo(Integer foo) {
theMap.put( "foo", foo );
}
我从ByteBuddy那里了解到,我实际上会做类似的事情:
builder.defineMethod( "getFoo", Integer.class, Modifier.PUBLIC )
.intercept( /* what goes here */ );
builder.defineMethod( "setFoo", Void.clss, Modifier.PUBLIC )
.withParameters( Integer.class )
.intercept( /* what goes here */ );
问题是拦截方法调用中包含了什么?
我最后就是这样做的
// The Getter
builder = builder.defineMethod( "getFoo", Integer.class, Modifier.PUBLIC )
.intercept(
MethodCall.invoke( Map.class.getMethod( "get", Object.class ) )
.onField( "theMap" )
.with( propertyKey ) );
// The Setter
builder = builder.defineMethod( "setFoo", void.class, Modifier.PUBLIC )
.withParameters( Integer.class )
.intercept(
MethodCall.invoke( Map.class.getMethod( "put", Object.class, Object.class ) )
.onField( "theMap" )
.with( propertyKey ) )
.withArgument( 0 )
.andThen( new Implementation.Simple( MethodReturn.VOID ) ) );
在这两种情况下,只需要将MethodCall#invoke
委托给我正试图使用适当的Map键封装的相应Map
方法。
同样在set方法的情况下,将传入参数0(提供的setter方法的参数)委托给带有键的map方法调用也很重要。
我必须将自定义方法方法添加到我的日志系统中。假设我有几行代码,例如: 日志记录由slf4j处理。如何通过添加新(!)扩展我的记录器方法,如public void error(SomeTypeObject obj){/implementation/} 目标是不更改现有代码。如何强制LoggerFactory返回使用上述方法扩展的自己的记录器实现? 我跟踪了这个问题的答案:stackoverflow.
问题内容: 我正在研究Spring Data JPA。考虑下面的示例,默认情况下我将使所有crud和finder功能正常工作,如果我想自定义finder,那么也可以在界面本身中轻松完成。 我想知道如何为上述AccountRepository的实现添加完整的自定义方法?由于它是一个接口,所以我不能在那里实现该方法。 问题答案: 你需要为自定义方法创建一个单独的接口: 并提供该接口的实现类:
homebody能帮我提示一下如何使用byte buddy 1.6.9重新定义静态方法吗? 我试过这个: 我遇到以下异常: 线程“main”java.lang.IllegalStateException中的异常:无法注入已经加载的类型:类委托。来源 谢谢
Thymeleaf有许多有用的实用程序,如或。我试图添加一个自定义的,但不知道如何注册这一点。
问题内容: 我正在尝试为Selenium编写自己的ExpectedConditions,但我不知道如何添加新的selenium。有人有例子吗?我在网上找不到任何教程。 在我目前的情况下,我想等到某个元素存在,可见,启用并且没有attr“ aria-disabled”属性。我知道这段代码行不通: 编辑:一些额外的信息:我遇到的问题是与jQuery选项卡。我在一个禁用的选项卡上有一个表单,它将在该选项