spring+groovy實現動態程式碼注入執行
昨天線上的程式碼呼叫一個遠端的服務無緣無故不成功,又沒加那麼多日誌,不好定位問題,好想線上上執行一下程式碼,列印點log看看
於是想著怎麼動態執行點java程式碼,忽然想起以前玩過的groovy,於是搞起來
大概思路是這樣,寫一個控制器,接收一段程式碼,動態執行,然後返回執行結果,切記,做好許可權控制,免得杯具
沒想到實現起來異常簡單
1、gradle.build加入groovy依賴
compile "org.codehaus.groovy:groovy:2.5.3"
2、寫個工具類,方便拿到spring上下文物件,這個很常見
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringContextUtils implements ApplicationContextAware {
static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context)
throws BeansException {
SpringContextUtils.context = context;
}
public static ApplicationContext getContext() {
return context;
}
public static void autowireBean(Object bean) {
context.getAutowireCapableBeanFactory().autowireBean(bean);
}
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
}
3、寫個控制器
import com.ruizton.util.SpringContextUtils;
import groovy.lang.GroovyClassLoader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Method;
@RestController
public class GroovyController {
@RequestMapping("/runScript")
public Object runScript(String script) throws Exception {
if (script != null) {
// 這裡其實就是groovy的api動態的載入生成一個Class,然後反射生成物件,然後執行run方法,最後返回結果
// 最精華的地方就是SpringContextUtils.autowireBean,可以實現自動注入bean,
Class clazz = new GroovyClassLoader().parseClass(script);
Method run = clazz.getMethod("run");
Object o = clazz.newInstance();
SpringContextUtils.autowireBean(o);
Object ret = run.invoke(o);
return ret;
} else {
return "no script";
}
}
}
上面是java的全部內容了,接下來就是呼叫了
首先準備寫個test.groovy程式碼
import org.springframework.beans.factory.annotation.Autowired
class Foo {
@Autowired
FooService fooService;
Object run() {
// do something
def f = fooService.findById(38);
if (f != null) {
return f.name
}
return null
}
}
不寫類直接寫程式碼塊也是可以的
test.groovy
def sum = 1 + 2
return "sum = " + sum
上面程式碼也會生成一個Class物件,裡面的程式碼預設在run方法下面,所以控制器哪裡都是呼叫的run方法
再寫個python呼叫一個介面,其實就是讀檔案然後呼叫一下java的介面,要是不怕死,也可以在後臺做一個視覺化介面,加個執行按鈕直接呼叫
test.py
#!/usr/bin/python
import requests
def read(filename):
f = open(filename,`r`)
file = f.read()
f.close()
return file
res = requests.post(`http://127.0.0.1/runScript.html`, data = {
`script`: read(`test.groovy`)
})
print res.text
$ chmod +x test.py
$ ./test.py
大功告成。盡情玩耍吧
相關文章
- 通過dylib實現iOS執行時Native程式碼注入(動態除錯)iOS除錯
- 如何用node.js實現動態執行指令碼Node.js指令碼
- PB程式碼動態解析執行器
- 200行Java程式碼實現依賴注入框架Java依賴注入框架
- iOS安全攻防(十九):基於指令碼實現動態庫注入iOS指令碼
- 幾十行程式碼實現ASP.NET Core自動依賴注入行程ASP.NET依賴注入
- javascript動態建立並執行css程式碼例項JavaScriptCSS
- C#動態執行函式:利用反射實現C#函式反射
- 使用expect執行動態指令碼指令碼
- Java知識點總結(動態執行JS程式碼 )JavaJS
- JavaScript動態建立script標籤並執行js程式碼JavaScriptJS
- 多執行緒-多執行緒方式1的程式碼實現執行緒
- 15 行程式碼實現單例模式依賴注入容器加靜態代理行程單例模式依賴注入
- 小程式骨架屏動態注入元件元件
- 藉助 Webpack 靜態分析能力實現程式碼動態載入Web
- 多執行緒-多執行緒方式2的思路及程式碼實現執行緒
- jQuery實現點選回車執行指定程式碼jQuery
- 分享一個c執行緒池實現程式碼執行緒
- Windows程式設計系列:遠執行緒注入Windows程式設計執行緒
- 使用PHP實現動態代理IP的示例程式碼PHP
- 實現js檔案動態載入程式碼例項JS
- canvas實現的動態心形效果程式碼例項Canvas
- 實現手機直播原始碼中兩個執行緒依次執行的相關程式碼原始碼執行緒
- 【Lua】實現程式碼執行覆蓋率統計工具
- 5行Python程式碼就能實現刷爆全網的動態條形圖!Python
- 獲取C#中方法的執行時間及其程式碼注入C#
- 180行JavaScript程式碼實現的小球隨機移動程式碼JavaScript隨機
- jQuery實現的動態載入指令碼檔案程式碼例項jQuery指令碼
- PHP 執行注入分享PHP
- web動態驗證碼的實現Web
- 實現動態驗證碼的思路
- javascript動態實現的表單提交效果程式碼例項JavaScript
- js實現的動態引入css檔案程式碼例項JSCSS
- javascript實現的動態新增和刪除表格行程式碼JavaScript行程
- css3實現的動態大白效果程式碼例項CSSS3
- 編輯cron實現自動執行
- 約玩原始碼中執行緒的呈現狀態,死鎖程式碼如何寫?原始碼執行緒
- 小程式頁面動態配置實現