Comment puis-je identifier les objets immuables en Java

Dans mon code, je suis entrain de créer une collection d'objets qui seront accessibles par différents threads dans un mode qui n'est sûr que si les objets sont immuables. Lors d'une tentative d'insertion d'un nouvel objet dans ma collection, je veux tester pour voir si elle est immuable (si pas, je vais jeter une exception).

Seule chose que je peux faire est de vérifier quelques-uns bien connus immuable types:

private static final Set<Class> knownImmutables = new HashSet<Class>(Arrays.asList(
        String.class, Byte.class, Short.class, Integer.class, Long.class,
        Float.class, Double.class, Boolean.class, BigInteger.class, BigDecimal.class
));

...

public static boolean isImmutable(Object o) {
    return knownImmutables.contains(o.getClass());
}

Cela me fait 90% du chemin, mais parfois, certains de mes utilisateurs voudront créer de simples immuable types de leur propre:

public class ImmutableRectangle {
    private final int width;
    private final int height;
    public ImmutableRectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public int getWidth() { return width; }
    public int getHeight() { return height; }
}

Est-il un moyen (peut-être l'aide de la réflexion) que j'ai pu détecter de manière fiable si une classe est immuable? Les faux positifs (pensant que c'est immuable, quand ce n'est pas le cas) ne sont pas acceptables, mais des faux négatifs (pensant que c'est mutable, quand ce n'est pas le cas) sont.

Modifiées afin d'ajouter: Merci pour les remarques pertinentes et des réponses utiles. Comme certaines des réponses souligné, j'ai négligé de définir mes objectifs de sécurité. La menace est ici désemparés développeurs -- c'est un morceau de code de la structure qui sera utilisé par un grand nombre de personnes qui ne savons presque rien sur le filetage et ne sera pas la lecture de la documentation. Je n'ai PAS besoin pour se défendre contre les logiciels malveillants -- n'importe qui assez intelligent pour muter une Chaîne de caractères ou d'effectuer d'autres manigances sera également assez intelligent pour savoir qu'il n'est pas sûr dans ce cas. L'analyse statique du code EST une option, tant qu'il est automatisé, mais les révisions de code ne peut pas compter sur lui car il est impossible de garantir à chaque examen aura threading-savvy examinateurs.

InformationsquelleAutor mcherm | 2008-10-15