Question

Je voulais ajouter à mon dossier jdk6\jre\lib\security\java.policy une interdiction de créer des classes qui sont sur la liste noire AppEngine. Par exemple, je veux que mon jvm local pour lancer une exception lorsque l'application essaie d'instancier javax.naming.NamingException.

Il est possible?

Je vais essayer d'expliquer mon problème spécifique ici. Google propose un service (moteur app GAE-google) qui a des limites à ce que les classes peuvent être utilisées. Par exemple ne pas instancier les classes JNDI qui sont dans le paquet de javax.naming. Ils offrent également un serveur de test qui peut être utilisé pour les tests de cette application sur ma machine, mais ce serveur permet à ces cours et peuvent exacute le code. Vous découvrez que vous avez utilisé une classe blacklisté seulement après que vous chargez votre application sur Google. Je pensais si une telle application de la liste noire de classe ne pouvait pas être fait sur le jvm de développement. Else Je pense que ce serait facile qu'ils pourraient déjà fournir un tel fichier.

Était-ce utile?

La solution

Vous pouvez écrire une petite application de chargeur qui crée un nouvelle, coutume classloader. Vos cours d'application pourraient alors être chargés en utilisant ce classloader.

Dans le classloader personnalisé, vous pouvez jeter ClassNotFoundException lorsque votre application tente d'accéder à une classe que vous voulez à la liste noire.

Vous aurez besoin de surcharger la méthode load (). Cette méthode sera responsable de lancer l'exception sur vos classes listes noires ordelegating au Classloader parent si la classe est autorisée. Un exemple d'implémentation:

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

(Bien sûr, une véritable mise en œuvre peut être beaucoup plus sophistiqué que cela)

Parce que les classes de votre application sont chargées par ce Classloader, et vous ne délèguent la loadClass () invocations à la classloader mère quand vous le souhaitez, vous pouvez la liste noire toutes les classes que vous avez besoin.

Je suis assez sûr que ce soit la méthode que Google utilise à la liste noire des classes dans leur serveur. Ils chargent toutes les applications dans un Classloader spécifique. Ceci est également similaire à la façon que Tomcat isole les différentes applications Web.

Autres conseils

N'êtes-vous pas obtenir assez d'erreurs de compilation que des erreurs d'exécution tout en testant votre programme? Vous pouvez configurer votre IDE ou compilateur pour vous avertir quand une classe non souhaitée est instancié. Je sais que AspectJ a quelques fonctionnalités intéressantes pour ceci: Vous pouvez définir des avertissements de compilation / erreurs sur les points de jonction et obtenir des commentaires en exemple Éclipse. Pour utiliser dans Eclipse, vous installez simplement le plugin AspectJ et d'écrire un aspect approprié. Pour obtenir les erreurs lors de la compilation d'une ligne de commande ou d'un script, vous auriez fait d'utiliser le compilateur AspectJ, mais je doute que vous auriez besoin que.

La documentation Java énumère toutes les autorisations possibles de politique ici: http://java.sun.com/javase/ 6 / docs / technotes / guides / sécurité / permissions.html

Création de classe / chargement n'est pas mentionné, donc je crois que vous ne pouvez pas appliquer cette aide d'une stratégie.

En tout cas, pourquoi voulez-vous lancer une exception lorsqu'une classe d'exception est chargée? Peut-être pourriez-vous expliquer votre problème, alors quelqu'un pourrait être en mesure de proposer une solution.

Modifier

Une façon d'empêcher le chargement de certaines classes serait de les retirer de l'installation JRE. La plupart des classes de système sont contenues dans rt.jar dans votre installation JDK / JRE. Vous devriez être en mesure de le modifier avec un outil ZIP.

Il suffit de créer une installation spéciale de votre JRE et modifier son rt.jar. C'est une bidouille horrible, mais devrait être OK à des fins de test ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top