在运行时(动态)创建简单的 POJO 类(字节码)

2023-11-30

我有以下场景..

我正在编写一些工具,可以对数据库运行用户输入的查询并返回结果。

最简单的方法是将结果返回为:List<String[]>但我需要更进一步。

我需要创建(在runtime)一些具有某些名称的 POJO(或 DTO),并为其创建字段、setter 和 getter,并用返回的数据填充它,然后将其返回给用户.class文件生成...

所以这里的想法是如何在运行时(动态)创建简单的类(字节码)我进行了基本搜索并发现了很多库包括 Apache BCEL但我想我需要一些更简单的东西......

你对那个怎么想的?

Thanks.


如果您使用,创建带有 getter 和 setter 的简单 POJO 会很容易CGLib:

public static Class<?> createBeanClass(
    /* fully qualified class name */
    final String className,
    /* bean properties, name -> type */
    final Map<String, Class<?>> properties){

    final BeanGenerator beanGenerator = new BeanGenerator();

    /* use our own hard coded class name instead of a real naming policy */
    beanGenerator.setNamingPolicy(new NamingPolicy(){
        @Override public String getClassName(final String prefix,
            final String source, final Object key, final Predicate names){
            return className;
        }});
    BeanGenerator.addProperties(beanGenerator, properties);
    return (Class<?>) beanGenerator.createClass();
}

测试代码:

public static void main(final String[] args) throws Exception{
    final Map<String, Class<?>> properties =
        new HashMap<String, Class<?>>();
    properties.put("foo", Integer.class);
    properties.put("bar", String.class);
    properties.put("baz", int[].class);

    final Class<?> beanClass =
        createBeanClass("some.ClassName", properties);
    System.out.println(beanClass);
    for(final Method method : beanClass.getDeclaredMethods()){
        System.out.println(method);
    }

}

Output:

类 some.ClassName
public int[] some.ClassName.getBaz()
公共无效 some.ClassName.setBaz(int[])
公共 java.lang.Integer some.ClassName.getFoo()
公共无效一些.ClassName.setFoo(java.lang.Integer)
public java.lang.String some.ClassName.getBar()
公共无效一些.ClassName.setBar(java.lang.String)

但问题是:您无法针对这些方法进行编码,因为它们在编译时不存在,所以我不知道这对您有什么好处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时(动态)创建简单的 POJO 类(字节码) 的相关文章

随机推荐

  • Android - 从 LocationClient 获取的位置不支持速度

    我正在使用新的 Google LocationClient 来检索地理位置 我需要获得每个点 位置 的速度 我现在正在做的是 if mLocationClient null mLocationClient new LocationClien
  • 如何使用 PHP 摘要?

    为什么要使用这样的摘要 它是否可以加快工作速度或者它的具体用途是什么 file1 php abstract class Search Adapter Abstract private ch null abstract private fun
  • 使用 Java DSL 在远程 S(ftp) 中移动已处理的文件

    一旦批处理使用 Spring 集成和 Java DSL 成功处理文件 我就会尝试在远程 SFTP 上移动文件 实现这一目标的最佳方法是什么 添加批量移动远程文件的步骤 或者使用FTP出站网关并提供MV命令 我倾向于选择第二种解决方案 让批处
  • 什么是虚拟方法?

    为什么要将一个方法声明为 虚拟 使用虚拟有什么好处 The Virtual修饰符用于标记可以在派生类中使用以下方式修改方法 属性 ect override修饰符 Example class A public virtual void Foo
  • Azure HTTP 请求超时解决方法

    目前 我们有一个托管在 Azure VM 实例上的应用程序 此应用程序有时会处理长时间运行和空闲的 HTTP 请求 这导致了一个问题 因为Azure 将关闭所有空闲时间超过几分钟的连接 我看到了一些关于设置较低 TCP keepalive
  • 如果运输方式是 Woocommerce 中的本地取货,则需要填写订单备注

    在 Woocommerce 中 我想要结账订单备注字段仅当选择本地取货作为运输方式 我已设法更改本地提货标签 以便指示客户向该字段添加详细信息 但想知道是否有一种方法不允许他们在向该部分添加详细信息之前继续操作 任何帮助将非常感激 下面的代
  • 使用空传播/空条件运算符时出错

    我在 VS 2013 中运行 NET 4 5 项目 为什么以下代码出错 var w Request Properties MS HttpContext as System Web HttpContextWrapper string IP w
  • symfony2 在构造函数中重定向

    我想在特定的情况下在构造函数中进行重定向 我尝试这样做 return new Symfony Component HttpFoundation RedirectResponse url 像这样 return this gt redirect
  • Chart.js - 绘制水平线

    我想使用在图表中绘制一条水平线Chart js 但我做不到 我读过这个问题 Chart js 绘制任意垂直线 但我无法转换绘图代码水平线不是垂直的 我希望你能帮助我 尤其是土豆皮 下面是绘制水平线的 JavaScript 代码 var da
  • Math.round(Math.random) 返回 3 个唯一数字问题 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 好的 所以我需要返回 3 个互不相等的随机数 然后 当
  • 具有不同调色板的 R 热图

    我正在尝试使用不同的调色板在 R 中创建一个简单的热图 我想使用渐变 以便所有低于阈值 N 的数字都指定为一种颜色 例如紫色 所有高于阈值的数字都指定为另一种颜色 例如橙色 数字离阈值越远 颜色应该越深 这是一个示例数据集 Division
  • 解析Json以获取一个NSArray中的所有内容

    内容就是这样 id title website categories id label updated id title website categories id
  • 将矩形扩展 100px

    我在 C 中使用 OpenCV 2 4 4 并且有 矩形 我想将其放大 x 像素 OpenCV 文档提供很好的例子 寻找 将矩形扩大或缩小一定量 如何在图像中使用它http opencv willowgarage com documenta
  • 对于指向同一单元格的两个范围变量,“Is”运算符不会返回 true

    我有一个名为的自定义类imera其中我包含一个名为的范围属性date cell 创建 imera 集合时 每个 imera 的 date cell 都设置为引用 Excel 中的特定单元格 尝试按 date cell 在集合中搜索时 Opt
  • iPhone如何在按音量键时隐藏音量覆盖

    我做了很多事情来解决这个问题 比如添加MPVolumeView 有人说系统音量HUD 如果您在当前添加 MPVolumeView 实例 则会隐藏 但这不起作用 我添加观察者来观察体积的变化 并拍照 但现在我不知道如何隐藏音量HUD 我尝试过
  • 将数字划分为显示在用户表单标签中的唯一排序数字

    我想将数字分成唯一的排序数字 例如 数字可以是 127425 我希望结果为 12457 这意味着已排序并删除了重复项 我认为最好是用例子来解释 Number Result 127425 12457 2784425 24578 121 12
  • 限制 Java 中的文本字段

    有没有办法限制文本字段只允许数字 0 100 从而排除字母 符号等 我找到了一种方法 但它比看起来必要的要复杂得多 如果必须使用文本字段 则应该使用JFormattedTextField with a 数字格式化程序 您可以设置 Numbe
  • Pharo 中的彩色窗口主题?

    如何在 Pharo 中切换到彩色窗口主题 不确定你指的是哪个主题 但你尝试过吗 世界菜单 gt 系统 gt 设置 gt 外观 gt 形态 gt 用户界面主题 选择框将让您选择窗口颜色主题
  • Git "git config --global user.name" 为什么存在这个选项?

    Git 初学者警报 我有一个基本问题 为什么 GIT 允许更改用户名作为配置选项 git config global user name trojan 这个选项是否会为提交者冒充并在历史 日志中造成混乱打开大门 为什么不像从用于连接 GIT
  • 在运行时(动态)创建简单的 POJO 类(字节码)

    我有以下场景 我正在编写一些工具 可以对数据库运行用户输入的查询并返回结果 最简单的方法是将结果返回为 List