动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中
動態代碼生成 靜態代碼生成
Speedment是一個開源工具包 ,可用于生成Java實體和管理器以與數據庫進行通信。 如果您需要域模型的對象關系映射,那么這很好,但是在某些情況下,您可能希望使用數據庫作為模板來生成完全不同的東西。 在本文中,我將向您展示一個hack,您可以使用該hack接管Speedment中的該代碼生成器并將其用于個人目的。 在本文的結尾,我們將提供一個完全空白的代碼生成器,我們可以對其進行編程以進行競標!
背景
Speedment旨在用作Maven的插件。 通過調用各種新的Maven目標,我們可以指示Speedment連接到數據庫,生成源代碼,并從我們的項目中刪除所有生成的文件。 它還包含一個圖形用戶界面,使您可以輕松地基于從數據庫中收集的元數據配置生成作業。 現在,想象一下我們可以通過分析該元數據收集的所有信息。 我們知道存在哪些表,知道它們具有的所有約束以及各個列具有什么類型。 可能有數百萬個用例,我們可以從該元數據自動生成內容中受益。 按照本文中的步驟,我們可以做所有這些事情。
步驟1:建立定期加速項目
創建一個新的Maven項目并將以下內容添加到pom.xml文件中:
pom.xml
<properties><speedment.version>3.0.1</speedment.version><mysql.version>5.1.39</mysql.version> </properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>runtime</artifactId><version>${speedment.version}</version><type>pom</type></dependency> </dependencies><build><plugins><plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies></plugin></plugins> </build>我們添加了Speedment作為運行時依賴項,并配置了Maven插件以使用標準MySQL JDBC驅動程序連接到我們的數據庫。 大! 現在,您可以訪問許多新的Maven目標。 例如,如果我們要啟動Speedment UI,可以通過運行以下命令來實現:
mvn speedment:tool如果我們現在這樣做,Speedment將以正常模式啟動,使我們能夠連接到數據庫,并從數據庫中生成實體和管理器,以使用Java 8流與該數據庫進行通信。 這不是我們這次想要做的。 我們希望對其進行修改,以使其完全滿足我們的要求。 因此,我們繼續修改pom。
步驟2:修改插件聲明
速度以模塊化的方式構建,由不同的工件負責不同的任務。 所有預先存在的生成器任務都位于一個名為“ com.speedment.generator:generator-standard”的工件中。 那就是我們要罷工的地方! 通過從類路徑中刪除該工件,我們可以防止Speedment生成我們不希望生成的任何東西。
我們將pom修改如下:
... <plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Add this: --><dependency><groupId>com.speedment</groupId><artifactId>tool</artifactId><version>${speedment.version}</version><type>pom</type><exclusions><exclusion><groupId>com.speedment.generator</groupId><artifactId>generator-standard</artifactId></exclusion></exclusions></dependency></dependencies> </plugin> ...那是什么? 我們通過添加一個來排除依賴項? 那怎么能工作呢? 好吧,Speedment旨在包含盡可能少的代碼,除非應用程序明確需要。 “ com.speedment:tool-artifact”已經是maven插件的依賴項,通過在maven插件的<dependencies>部分中提及它,我們可以將設置附加到其配置中。 在這種情況下,我們說我們希望插件可以訪問該工具,但我們不希望標準生成器。
但是這里有一個問題。 如果我們嘗試啟動speedment:tool目標,我們將獲得一個例外。 原因是Speedment 希望標準翻譯器位于類路徑中。
這是第二個丑陋的入侵發生的地方。在我們的項目中,我們創建一個名為com.speedment.generator.standard的新程序包,并在其中定義一個名為StandardTranslatorBundle.java的新Java文件。 事實證明,這是Speedment真正需要工作的唯一文件。 我們為其提供以下內容:
StandardTranslatorBundle.java
package com.speedment.generator.standard;import com.speedment.common.injector.InjectBundle; import java.util.stream.Stream;public final class StandardTranslatorBundle implements InjectBundle {@Overridepublic Stream<Class<?>> injectables() {return Stream.empty();} }接下來,我們需要用我們自己的項目替換排除的工件,以使插件永遠不會意識到文件丟失。 我們返回到pom.xml文件,并將我們自己的項目添加到speedment-maven-plugin的<dependencies>部分。 完整的pom文件如下所示:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.github.pyknic</groupId><artifactId>speedment-general-purpose</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><speedment.version>3.0.1</speedment.version></properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>runtime</artifactId><version>${speedment.version}</version><type>pom</type></dependency></dependencies><build><plugins><plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>com.speedment</groupId><artifactId>tool</artifactId><version>${speedment.version}</version><type>pom</type><exclusions><exclusion><groupId>com.speedment.generator</groupId><artifactId>generator-standard</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.github.pyknic</groupId><artifactId>speedment-general-purpose</artifactId><version>1.0.0-SNAPSHOT</version></dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency></dependencies></plugin></plugins></build> </project>如果現在我們構建項目,然后運行target speedment:tool,我們應該能夠毫無問題地啟動圖形用戶界面。 如果我們連接到數據庫,然后按“ Generate”,則什么也不會發生! 我們已經成功地破解了Speedment,使其無所作為!
第3步:將速度變成您想要的東西
現在,當我們有了全新的,干凈的Speedment時,就可以開始將其轉變為我們想要的應用程序了。 我們仍然具有強大的用戶界面,可以在其中基于數據庫模型配置代碼生成。 我們有一個富有表現力的實用程序和幫助程序類庫,用于處理生成的代碼。 最重要的是,我們擁有一種用于以面向對象的方式分析數據庫元數據的結構。
要了解有關如何編寫自己的代碼生成模板并將其掛鉤到平臺的更多信息, 請參閱本文 。 您還應該查看Speedment GitHub頁面,以了解現有生成器(我們剛剛禁用的生成器)如何工作,并可能會啟發您如何構建自己的生成器。
直到下次,繼續入侵!
翻譯自: https://www.javacodegeeks.com/2016/11/hack-speedment-personal-code-generator.html
動態代碼生成 靜態代碼生成
總結
以上是生活随笔為你收集整理的动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不暴露自己生日的说说(生日高级有质感的句
- 下一篇: 微基准测试 r_在您的构建过程中添加微基