在java spring中,是否可以动态将一个新的class加载到beanFactory中?是否可以将class类以字节流的方式存到redis中,再由类加载器重新加载到java运行实例中?
目前项目中有一个需求,需要可以动态地加载类到spring的beanFactory中或者说applicationContext里面,这个类是可以由开发人员动态上传到生产环境中,而无需重新启动生产环境。请问是否可以做到呢?还有一个问题,是否可以将class文件以字节的方式暂存在redis中间件上,需要用这个class时,动态地加载它?
Après JDK1.5, il existe une API java.lang.instrument.Instrumentation prête à l'emploi pour implémenter cette fonction.
L'interface ci-dessus peut redéfinir le
class
existant.Utilisez comme ci-dessous.
Méthode pour obtenir un
Instrumentation
objet :agent.jar
Vous devez spécifierAgent-Class
lors de l'emballage etCan-Redefine-Classes
activer la fonction de réécriture de classe.Agent.java
Mise en œuvreIci, j'ai injecté l'objet
JMX
à traversInstrumentation
. Pourquoi l'ai-je fait de cette façon ?est dû au fait que l'environnement dans lequel
vm.loadAgent();
s'exécute est nouveau et que je ne peux pas utiliser de méthodes statiques pour définir les propriétés. Bien que les classes soient les mêmes, leClassLoader
qui charge la classe est incohérent. Plus tard, j'ai essayé de l'appeler en utilisantJMX
.D'accord, tant que vous obtenez l'objet
Instrumentation
, vous pouvez faire tout ce que vous ne pouviez pas faire auparavant.Essayez d'obtenir l'AutowireCapableBeanFactory via ApplicationContext, puis appelez la méthode createBean() ou autowire() pour injecter
Java a des flux d'entrée et de sortie d'objets, vous pouvez donc certainement stocker des objets en octets
Tout ce qui est mentionné ci-dessus est faux. Je peux vous dire clairement que tout est possible.
marquer pour apprendre