gpt4 book ai didi

java - 名称在编译时已知并在运行时扩展其他类的类

转载 作者:行者123 更新时间:2023-11-29 08:35:51 25 4
gpt4 key购买 nike

我希望创建专有适配器(超)类的开源实现(子类)。我有两个不同的要求:

  1. 我需要在运行时扩展子类,而不是在编译时
  2. 我的子类的类名必须在编译时知道。

用例:由于父类(super class)有专有许可,我不能在我的开源项目的构建中包含它的源代码,也不能引用预构建的二进制文件。我的子类的实际运行时使用将出现在专有的封闭源代码框架代码中。该框架将按名称创建我的子类的实例。因此,我的子类名称需要提前知道。

后一个问题似乎排除了像 cglib 这样在运行时创建新类名的方法。

示例代码:

package com.proprietary;
public class Adapter {}

package org.free;
public class AdapterImpl
// com.proprietary is not available at compile time
// extends com.proprietary.Adapter
{}

package com.proprietary;
public class Framework {

public static void main(String[] args) {
// Simplified: class name is not hard-coded in reality,
// but comes from external config
Class c = Class.forName("org.free.AdapterImpl");
...
}
}

最佳答案

也许看看ByteBuddy .

您可以动态地“创建”一个新类,具有有助于支持您的约束的功能:

  • 使用 Class.forName 加载第三方专有类而不在您的代码中链接到它,您将类名作为配置点传递
  • Naming strategy让您控制生成类的名称
  • intercept( Implementation ) 以插入您的自定义代码。

例子:

Class<?> dynamicType = new ByteBuddy()
.subclass(Class.forName(thatPeskyProprietaryClass))
.namingStrategy(...)
.method(ElementMatchers.named("someMethod"))
.intercept(...)
.make()
.load(getClass().getClassLoader())
.getLoaded();

关于java - 名称在编译时已知并在运行时扩展其他类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44151770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com