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除錯
- 動態執行c#程式碼C#
- 200行Java程式碼實現依賴注入框架Java依賴注入框架
- C#呼叫IronPython動態執行Python程式碼C#Python
- 幾十行程式碼實現ASP.NET Core自動依賴注入行程ASP.NET依賴注入
- 執行緒池的實現程式碼分析執行緒
- Java知識點總結(動態執行JS程式碼 )JavaJS
- 15 行程式碼實現單例模式依賴注入容器加靜態代理行程單例模式依賴注入
- 小程式骨架屏動態注入元件元件
- 藉助 Webpack 靜態分析能力實現程式碼動態載入Web
- 5行Python程式碼就能實現刷爆全網的動態條形圖!Python
- 180行JavaScript程式碼實現的小球隨機移動程式碼JavaScript隨機
- 實現手機直播原始碼中兩個執行緒依次執行的相關程式碼原始碼執行緒
- 【Lua】實現程式碼執行覆蓋率統計工具
- 使用PHP實現動態代理IP的示例程式碼PHP
- Ruby on Rails 動態渲染遠端程式碼執行漏洞 (CVE-2016-0752)AI
- TP-Link SR20遠端程式碼執行動態除錯除錯
- 獲取C#中方法的執行時間及其程式碼注入C#
- Springboot啟動時執行指定程式碼Spring Boot
- Windows程式設計系列:遠執行緒注入Windows程式設計執行緒
- 約玩原始碼中執行緒的呈現狀態,死鎖程式碼如何寫?原始碼執行緒
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- 程式碼執行
- 十幾行程式碼實現一個ts依賴注入行程依賴注入
- 160行程式碼實現動態炫酷的視覺化圖表 - 排行榜行程視覺化
- 程式碼注入之遠端呼叫執行緒的一些問題執行緒
- web動態驗證碼的實現Web
- 小程式頁面動態配置實現
- 自己動手實現springboot執行時執行java原始碼(執行時編譯、載入、註冊bean、呼叫)Spring BootJava原始碼編譯Bean
- 程式碼注入
- 服務端模板注入:現代WEB遠端程式碼執行(補充翻譯和擴充套件)服務端Web套件
- 10行程式碼實現頁面無限滾動行程
- 基於Apache Zookeeper手寫實現動態配置中心(純程式碼實踐)Apache
- MyBatis動態代理執行原理MyBatis
- 一行 Python 程式碼實現並行Python並行
- Java的六種執行緒狀態及程式碼示例Java執行緒
- 手動實現一個JS執行引擎JS
- 幾十行程式碼實現一個vue的狀態管理行程Vue