Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JDBI@BindBean与AutoValue一起使用_Java_Reflection_Jdbi_Auto Value - Fatal编程技术网

Java 将JDBI@BindBean与AutoValue一起使用

Java 将JDBI@BindBean与AutoValue一起使用,java,reflection,jdbi,auto-value,Java,Reflection,Jdbi,Auto Value,TLDR JDBI@BindBean注释使用自动值生成的类型生成一个IllegalAccessException,因为生成的类型是包私有的,默认情况下不能使用反射进行访问 JDBI是否不灵活,或者是否有通过AutoValue的解决方法?(完整问题如下) 快速背景 我试图将JDBI@BindBean注释与一个类型一起使用,该类型的源代码是使用AutoValue生成的 package com.example; @AutoValue public abstract class Foo { pub

TLDR JDBI
@BindBean
注释使用自动值生成的类型生成一个
IllegalAccessException
,因为生成的类型是包私有的,默认情况下不能使用反射进行访问

JDBI是否不灵活,或者是否有通过AutoValue的解决方法?(完整问题如下)

快速背景

我试图将JDBI
@BindBean
注释与一个类型一起使用,该类型的源代码是使用AutoValue生成的

package com.example;

@AutoValue
public abstract class Foo {
  public String getBar();
}
问题是生成的代码看起来像:

package com.example;

@AutoValue
class AutoValue_Foo extends Foo {
  private final String bar;

  @Override
  public String getBar() {
    return this.bar;
  }

  // toString, equals, hashCode
}
注意这个类是包私有的

现在,如果我尝试使用
@BindBean
,例如:

@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);
由于
AutoValue\u Foo
是包私有的,并且
BindBeanFactory
使用反射,如果尝试使用
AutoValue\u Foo
类型调用
find
,结果是:

java.lang.IllegalAccessException: ... can not access a member of class com.example.Foo with modifiers "public"
相关的JDBI代码如下所示。我从Java反射的角度理解,这可以通过使用
setAccessible(true)
来解决,但这需要对JDBI进行PR

问题如下:

  • 有没有一种方法可以重新构造我的代码,在那里我可以绑定 使用
    @BindBean
    键入
    AutoValue\u-Foo
    ,而不创建新的JDBI 制图员

  • 有没有办法让
    @AutoValue
    生成
    public
    。我理解为什么这通常是不可取的 (推动人们使用接口,而不是实现)

  • BindBeanFactory
    是否过于死板?它应该利用吗
    setAccessible(true)
    在其他可用方法上 在他们的原始包装之外


  • JDBI的2.71版将包括使用
    type
    字段为
    @BindBean
    指定类型令牌的功能。此类型标记将允许指定用于对提供的参数进行反射调用的类型

    @SqlQuery(“从baz中选择*,其中bar=:foo.bar”)
    条件查找(@BindBean(value=“foo”,type=foo.class)foo-foo);
    


    使用此技术,您可以消除上述
    IllegalAccessException

    您可以使用Lombok的
    @Data
    ()而不是
    @AutoValue
    。它在类中生成样板文件,而不是生成实现类型。也许不是你想要的,但它对我来说很有用。@Jorn很有兴趣知道龙目山的工作原理。不幸的是,我被锁定在AutoValue中,但这可能对其他具有更大灵活性的工程师有用。请向JDBI提交PR。我会引导它通过。