在java spring中,是否可以动态将一个新的class加载到beanFactory中?是否可以将class类以字节流的方式存到redis中,再由类加载器重新加载到java运行实例中?
目前项目中有一个需求,需要可以动态地加载类到spring的beanFactory中或者说applicationContext里面,这个类是可以由开发人员动态上传到生产环境中,而无需重新启动生产环境。请问是否可以做到呢?还有一个问题,是否可以将class文件以字节的方式暂存在redis中间件上,需要用这个class时,动态地加载它?
在JDK1.5之後要實現這個功能有現成的API java.lang.instrument.Instrumentation。
上面的介面就可以重定義已經存在的
class
。像下面的方式使用。
取得
Instrumentation
物件的方法:agent.jar
打包时需要指定Agent-Class
,Can-Redefine-Classes
開啟類別重寫義功能。Agent.java
實作這裡我是透過
是因為JMX
將JMX
将Instrumentation
对象注入过去的,当时为什么要这样来做呢。是因为
vm.loadAgent();
运行的环境是一个全新的,我无法使用静态方法来设置属性,虽然类相同但是加载该个类的ClassLoader
却不一致。后面我尝试出可以使用JMX
物件注入過去的,當時為什麼要這樣來做。vm.loadAgent();
運行的環境是一個全新的,我無法使用靜態方法來設定屬性,雖然類別相同但是加載該類別的ClassLoader卻不一致。
後面我嘗試出可以使用JMX
的方式呼叫。Instrumentation
好了,只要拿到試試看透過ApplicationContext取得AutowireCapableBeanFactory, 然後呼叫createBean()或autowire()方法注入
java有object輸入輸出流,所以你把物件以位元組的方式存起來,一定是可以的
樓上說的都不對。可以明確的告訴你,都是可以的。
mark 學習下