出于好奇,有没有(稳定的)开源项目用于运行java代码生成而不是cglib?我为什么要用它们呢?
一个类可以在运行时向自己添加一个方法(比如从一个static块),这样如果有人在这个类上执行反射,他们会看到新方法,即使它没有在编译时定义?
背景:
我正在使用的框架要求按惯例Action定义具有doAction(...)方法的类.框架在运行时检查这些类,以查看其doAction()方法中可用的参数类型.例如:doAction(String a,Integer b)
我希望每个类能够以编程方式生成doAction()具有各种参数的方法,并在检查时及时生成.方法的主体可以是空的.
在了解了LLVM如何工作之后,我对如何生成可移植的低级代码以及如何构建这个"东西"模块感到非常兴奋.
但我今天发现C--的存在似乎与LLVM共享一些概念.
所以我正在寻找一些信息,帮助我理解这两个项目之间的主要区别......以及为什么两者都存在.
对我来说,LLVM看起来有点像瑞士军刀用于编译器基础设施,而C--看起来远不如先进.
我有一个使用Ant脚本构建的Java项目.我正在尝试将项目转换为Maven.
其中一个任务生成一个名为Version.java的Java源文件,其中包含编译时间戳的静态String表示形式,如下所示:
package com.foo.bar;
public final class Version {
public static String VERSION="100301.1046";
}
Run Code Online (Sandbox Code Playgroud)
Ant任务非常简单:
<target name="version" depends="init" description="Create Version.java">
<echo file="src/${package.dir}/Version.java" message="package ${package.name};${line.separator}" />
<echo file="src/${package.dir}/Version.java" append="true" message="public final class Version {${line.separator}" />
<echo file="src/${package.dir}/Version.java"
append="true"
message=" public static String VERSION="${buildtime}";${line.separator}" />
<echo file="src/${package.dir}/Version.java" append="true" message="}${line.separator}" />
<echo message="BUILD ${buildtime}" />
</target>
Run Code Online (Sandbox Code Playgroud)
是否可以使用生成源或其他简单方法在Maven中执行类似的操作?
有没有人知道为给定类自动生成数据库表的方法?我不是在寻找一个完整的持久层 - 我已经有了一个我正在使用的数据访问解决方案,但我突然要从大量的类中存储大量信息而且我真的不想创建所有这些表都是手工制作.例如,给定以下类:
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我期待以下SQL:
CREATE TABLE Foo
(
Property1 VARCHAR(500),
Property2 INT
)
Run Code Online (Sandbox Code Playgroud)
我也想知道你如何处理复杂的类型.例如,在之前引用的类中,如果我们将其更改为:
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private System.Management.ManagementObject …Run Code Online (Sandbox Code Playgroud) 我做了比"普通的旧C"编程更多的C++编程.在普通C编程时,我非常想念的一件事是类型安全的通用数据结构,它是通过模板在C++中提供的.
为了具体起见,请考虑一般的单链表.在C++中,定义自己的模板类,然后根据需要对其进行实例化是一件简单的事情.
在C中,我可以想到一些实现通用单链表的方法:
我不喜欢选项1,因为它颠覆了类型系统,并且可能比特定类型的特定实现具有更差的性能.对于所有类型使用数据结构的统一表示,并向/从void指针进行转换,据我所知,需要一个间接性,这可以通过专用于元素类型的实现来避免.
选项2不需要任何额外的工具,但感觉有些笨拙,并且在使用不当时可能会导致错误的编译器错误.
选项3可以提供比选项2更好的编译器错误消息,因为专用数据结构代码将以扩展形式存在,可以在编辑器中打开并由程序员检查(而不是由预处理器宏生成的代码).但是,这个选项是最重量级的,一种"穷人的模板".之前我使用过这种方法,使用一个简单的sed脚本来专门化一些C代码的"模板化"版本.
我想用C而不是C++来编写我未来的"低级"项目,但是为每种特定类型重写通用数据结构的想法让我感到害怕.
人们对这个问题有什么经验?C中是否存在通用数据结构和算法的良好库,这些库不与选项1一起使用(即与void指针进行转换,这会牺牲类型安全性并增加间接级别)?
使用Reflection.Emit库与CodeDOM在运行时动态生成代码有什么优缺点?
我试图在基于XML格式运行时可用元数据的系统中生成一些(相对复杂的)动态类.我将生成扩展应用程序集中现有类的类,实现其他接口,添加方法以及覆盖虚拟和抽象成员.
我想确保在深入实现之前选择适当的技术.有关这些不同代码生成技术如何不同的任何信息都会有所帮助.此外,任何有关简化或简化工作的开源库的信息都将是有用的.
我正在使用Google Protocol Buffers为我的项目生成一些Java类.使用Maven 2及其"antrun"插件,这些类在编译之前新生成,输出到目标/生成源并在构建期间放入类路径.因此,从POM构建项目是没有问题的.
但是,Eclipse不知道如何解析生成的类,因为它所在的文件夹在开发过程中似乎不在IDE的类路径中.我正在使用m2eclipse并让它为我管理依赖项,所以我原本期望Maven能够处理这个问题.
如何为生成的代码获得IDE支持(代码完成等)?
如何从t4模板中获取对visual studio项目或解决方案目录或t4模板目录的引用?
我有一个模板将一些文件连接在一起,这些文件位于相对于模板的位置.我需要通过相对手段获得对绝对位置的引用.硬编码绝对路径是不可接受的,因为visual studio项目并不总是在同一位置,这会破坏代码生成.从环境中读取当前工作目录也不起作用,因为它返回T4引擎所在的位置而不是模板.我刚刚进入t4,所以任何帮助都会受到赞赏.