代码之家  ›  专栏  ›  技术社区  ›  Jules

使用cglib重写包本地方法

  •  2
  • Jules  · 技术社区  · 14 年前

    我有一个Java库,正在使用CGLIB创建由库用户提供的抽象类的子类,并提供由用户在其中自动生成的抽象方法的实现。

    我的问题是,如果所讨论的方法具有包本地(即默认)可访问性,那么我生成的方法显然会被忽略,并且当调用它时,用户会得到一个abstractMethodError。

    我生成的类与原始类在同一个包中(我生成一个名为original.package.original class name_automaticimplementation的类),尽管它们当然是由不同的类加载器加载的(即加载由cglib而不是磁盘生成的字节数组的类)。我怀疑这就是问题所在。如果有的话,有什么办法可以解决吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Michael Wiles    14 年前

    当使用包本地时,它是类加载器 定义方法是否可访问的包名称。这是为了阻止类未经授权访问API方法。您可以在java.lang包中装入一个类,并在java.lang中访问包本地方法。

    您可以尝试调整类加载器加载要扩展的类,然后加载将该类加载器作为cglib加载器父级的cglib版本。不知道它是否有效。