찾다

 >  Q&A  >  본문

在java spring中,是否可以动态将一个新的class加载到beanFactory中?

在java spring中,是否可以动态将一个新的class加载到beanFactory中?是否可以将class类以字节流的方式存到redis中,再由类加载器重新加载到java运行实例中?
目前项目中有一个需求,需要可以动态地加载类到spring的beanFactory中或者说applicationContext里面,这个类是可以由开发人员动态上传到生产环境中,而无需重新启动生产环境。请问是否可以做到呢?还有一个问题,是否可以将class文件以字节的方式暂存在redis中间件上,需要用这个class时,动态地加载它?

阿神阿神2768일 전489

모든 응답(5)나는 대답할 것이다

  • PHPz

    PHPz2017-04-18 10:28:24

    JDK1.5 이후에는 이 기능을 구현하기 위한 기성 API java.lang.instrument.Instrumentation이 있습니다.

    으아악

    위 인터페이스는 기존 class을 재정의할 수 있습니다.
    아래와 같이 사용하세요.

    으아악

    Instrumentation개체 획득 방법:

    으아악

    agent.jar패키징 시 Agent-Class를 지정하고 Can-Redefine-Classes 클래스 재작성 기능을 활성화해야 합니다.

    으아악

    Agent.java구현

    으아악

    여기서는 JMX을 통해 Instrumentation 객체를 주입했습니다.
    vm.loadAgent();이 실행되는 환경이 완전히 새로운 환경이고, 속성을 설정하기 위해 정적 메서드를 사용할 수 없기 때문입니다. 클래스는 동일하지만 클래스를 로드하는 ClassLoader은 일관성이 없습니다. . 나중에 JMX를 사용하여 호출해 보았습니다.

    좋아, Instrumentation 객체만 얻으면 이전에 할 수 없었던 모든 것을 할 수 있습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:28:24

    ApplicationContext를 통해 AutowireCapableBeanFactory를 가져온 다음 createBean() 또는 autowire() 메서드를 호출하여 삽입합니다.

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:28:24

    Java에는 객체 입력 및 출력 스트림이 있으므로 객체를 확실히 바이트 단위로 저장할 수 있습니다.

    회신하다
    0
  • 阿神

    阿神2017-04-18 10:28:24

    위에서 언급한 내용은 모두 잘못된 내용입니다. 모든 것이 가능하다는 것을 분명히 말씀드릴 수 있습니다.

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:28:24

    학습 표시

    회신하다
    0
  • 취소회신하다