A solução do seu problema passa pelo que se chamam “pontos de extensão”. Esse nome não é apenas desse produto que vc conhece. É um nome geral. O problema é como definir esses pontos e como definir a extensão. O Eclipse utiliza a tecnologia do OSGI para conseguir isso. Veja que não basta apenas escrever um script, é necessário conhecer as suas dependencias. Se o script for autosuficiente - ou seja, não chama bibliotecas diferentes das bibliotecas da aplicação pai, então a solução de usar uma linguagem de script -como o Vini falou , é concerteza o mais simples.
Mas vc precisa definir os pontos onde os scripts poderão ser colocados e descrever o que eles podem fazer.
Para isso a forma mais simples é definir uma interface que tenha os métodos necessários. Ai vc cria uma implementação padrão para essa interface que fará o mecanismo padrão. Através da API de Scripting vc consegue carregar essa interface implementada em script (grrovy ou javascript ou qq outro que vc queira: javascript é interressante porque não requer mais bibliotecas que o jse normal).
O objeto carregado pelo script substituiria o outro.
Outra opção é definir aspetos. Isto é mais simples conceitualmente, mas difícil na prática. Vc teria objetos que executam métodos antes, depois, ou em vez dos métodos padrão. Então para um método “emitirNota” vc teria um aspecto em torno desse método que executa um método classe do aspecto antes de chamar o “emitirNota”, um método que é chamado depois ou um método que é chamado em vez, substituindo o método original (esta opção é poderosa mas perigosa, sugiro que utilize apenas métodos antes e depois)
O script pode ser utilizado para criar este tipo de objetos.
Utilizar o padrão Observer ( listeners) não funciona para este caso porque não estamos reagindo a um evento, estamos interceptando o evento e fazendo coisas a mais ou diferentes.