Domanda

ho voluto aggiungere al mio file jdk6\jre\lib\security\java.policy un'interdizione per creare alcune classi che sono sulla lista nera di AppEngine. Per esempio io voglio che il mio JVM locale per generare un'eccezione quando l'applicazione tenta di creare un'istanza javax.naming.NamingException.

E 'possibile?

cercherò di spiegare il mio problema specifico qui. Google offre un servizio di (GAE-Google App Engine) che ha alcune limitazioni su ciò che possono essere utilizzati classi. Ad esempio non istanziare classi JNDI che sono in pacchetto javax.naming. Offrono anche un server di test che può essere utilizzato per i test questa applicazione sulla mia macchina, ma questo server permette di tali classi e possono exacute il codice. Si scopre che si è utilizzato una classe lista nera solo dopo aver caricato l'applicazione per google. Stavo pensando se tale classe applicazione lista nera non poteva essere fatto sulla JVM di sviluppo. Altrimenti mi viene da pensare che questo sarebbe stato facile che potrebbe già fornire tale file dei criteri.

È stato utile?

Soluzione

Si potrebbe scrivere un piccolo caricatore applicazioni che crea un nuovo, personalizzato classloader . Le tue lezioni di applicazioni potrebbero quindi essere caricate utilizzando questo programma di caricamento classe.

Nel classloader personalizzato, è possibile poi gettare ClassNotFoundException quando l'applicazione cerca di accedere a una classe che si desidera mettere in blacklist.

Sarà necessario sovraccaricare il metodo load (). Questo metodo sarà responsabile per gettare l'eccezione sulle classi nella lista nera ordelegating al programma di caricamento classi genitore se è consentita la classe. Un esempio di implementazione:

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);
}

(Naturalmente, una vera e propria implementazione può essere il modo più sofisticato di questo)

Poiché le classi dell'applicazione vengono caricati attraverso questo programma di caricamento classi, e vi sono solo delegando la loadClass () invocazioni al caricamento classe genitore quando si desidera, è possibile lista nera tutte le classi che avete bisogno.

Sono abbastanza sicuro che questo è il metodo che Google utilizza per lista nera classi nella loro server. Si caricano ogni applicazione in un programma di caricamento classi specifiche. Questo è anche simile al modo in cui Tomcat isola le diverse applicazioni Web.

Altri suggerimenti

Non preferiresti ottenere gli errori di compilazione di errori di runtime durante il test il vostro programma? Si potrebbe configurare il compilatore IDE o per avvisare quando una classe indesiderato viene creata un'istanza. So AspectJ ha alcune funzioni interessanti per questo: è possibile definire gli avvisi di compilazione / errori unirsi punti e ottenere un feedback in es Eclisse. Per utilizzare questa in Eclipse, è sufficiente installare il plugin AspectJ e scrivere un aspetto adeguato. Per ottenere gli errori durante la compilazione dalla riga di comando o uno script, si sarebbe effettivamente necessario utilizzare il compilatore AspectJ, ma dubito che si avrebbe bisogno che.

La documentazione Java sono elencati tutti i possibili permessi di politica qui: http://java.sun.com/javase/ 6 / docs / note tecniche / guide / security / permissions.html

creazione Class / caricamento non è menzionato, quindi credo che non si può far rispettare questo utilizzando un criterio.

In ogni caso, il motivo per cui vuoi un'eccezione quando una classe di eccezione viene caricata? Forse si potrebbe spiegare il problema, allora qualcuno potrebbe essere in grado di proporre una soluzione.

Modifica

Un modo per evitare il caricamento di alcune classi potrebbe essere quella di rimuoverli dalla installazione di JRE. La maggior parte delle classi di sistema sono contenute in rt.jar nel JDK installazione / JRE. Si dovrebbe essere in grado di modificare con qualsiasi ZIP-strumento.

Basta creare uno speciale installazione del JRE, e modificare la sua rt.jar. Questo è un brutto hack, ma dovrebbe essere ok per scopi di test ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top