Pergunta

Eu queria acrescentar ao meu arquivo jdk6\jre\lib\security\java.policy uma interdição para criar algumas classes que estão na lista negra por appengine. Por exemplo, eu quero a minha JVM local para lançar uma exceção quando as tentativas de aplicação para javax.naming.NamingException instanciar.

É possível?

Vou tentar explicar o meu problema específico aqui. Google oferece um serviço (GAE-google app engine) que tem algumas limitações sobre o que as classes podem ser usados. Por exemplo, não instanciar classes de JNDI que estão em javax.naming pacote. Eles também oferecem um servidor de teste que pode ser usado para testes desta aplicação na minha máquina, mas este servidor permite que tais classes e pode exacute o código. Você descobrir que você usou uma classe lista negra só depois de fazer upload de seu aplicativo para o Google. Eu estava pensando se essa classe aplicação da lista negra não poderia ser feito na JVM desenvolvimento. Outra coisa que eu estou pensando que isso seria fácil eles já pode fornecer tal arquivo de política.

Foi útil?

Solução

Você poderia escrever um pequeno aplicativo loader que cria um novo, personalizado carregador de classe. Suas classes de aplicação poderia então ser carregados usando este carregador de classe.

No carregador de classe personalizado, você pode então jogue ClassNotFoundException quando suas tentativas de aplicação para acessar uma classe que você quiser lista negra.

Você vai precisar sobrecarregar o método load (). Este método será responsável por lançar a exceção em suas aulas na lista negra ordelegating ao Classloader pai se a classe é permitido. A implementação de exemplo:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(Claro, a implementação real pode ser muito mais sofisticado do que isso)

Como as classes de sua aplicação são carregados através desta Classloader, e você só está delegando a invokations para o carregador de classe pai loadClass () quando você quiser, você pode barrar todas as classes que você precisa.

Estou bastante certo de que este é o método que o Google usa para classes de lista negra em seu servidor. Eles carregam cada aplicativo em um determinado Classloader. Isso também é similar à maneira que Tomcat isola os diferentes aplicativos da Web.

Outras dicas

Você não gostaria de obter erros de compilação do que erros de execução ao testar o seu programa? Você pode configurar o IDE ou compilador para avisá-lo quando uma classe indesejada é instanciado. Eu sei AspectJ tem algumas características interessantes para isso: Você pode definir avisos de compilação / erros em juntar pontos e obter feedback no exemplo Eclipse. Para usar isso em Eclipse, basta instalar o plugin AspectJ e escrever um aspecto adequado. Para obter os erros durante a compilação de uma linha de comando ou script, você realmente tem que usar o compilador AspectJ, mas eu duvido que você precisa disso.

Listas de documentação O Java todas as possíveis permissões de política aqui: http://java.sun.com/javase/ 6 / docs / technotes / guias / security / permissions.html

Class criação / carregamento não é mencionado, então eu acredito que você não pode impor isso usando uma política.

De qualquer forma, por que você quer para lançar uma exceção quando uma classe de exceção é carregado? Talvez você poderia explicar o seu problema, então alguém pode ser capaz de propor uma solução.

Editar:

Uma maneira de impedir o carregamento de determinadas classes seria retirá-los da instalação do JRE. A maioria das classes de sistema estão contidas em rt.jar na sua instalação JDK / JRE. Você deve ser capaz de modificá-lo com qualquer ZIP-ferramenta.

Apenas criar uma instalação especial de sua JRE, e modificar seu rt.jar. Isso é uma gambiarra, mas deve estar OK para fins de teste ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top