Maison > Java > javaDidacticiel > Comment réparer : erreur de réflexion Java : impossible d'accéder à la propriété privée

Comment réparer : erreur de réflexion Java : impossible d'accéder à la propriété privée

WBOY
Libérer: 2023-08-18 20:25:45
original
1620 Les gens l'ont consulté

Comment réparer : erreur de réflexion Java : impossible daccéder à la propriété privée

Comment résoudre : Erreur de réflexion Java : Impossible d'accéder aux propriétés privées

Introduction :
Dans le processus de développement Java, nous utilisons souvent la réflexion pour obtenir et exploiter dynamiquement des informations de classe. Cependant, nous rencontrons parfois une erreur courante lors de l'utilisation de l'API de réflexion : les propriétés privées ne sont pas accessibles. Cet article décrit la cause de ce problème et fournit des exemples de code de la solution.

Description du problème :
Lorsque nous utilisons la réflexion pour obtenir les propriétés privées d'une classe, nous recevons parfois une IllegalAccessException, indiquant que nous n'avons pas les autorisations suffisantes pour accéder à la propriété.

Analyse des causes :
La raison de ce problème est que les attributs ou méthodes de la classe sont limités à un accès privé. Les autorisations de contrôle d'accès de Java sont divisées en quatre niveaux : public, protégé, par défaut (c'est-à-dire sans modificateurs) et privé. L'API de réflexion ne peut accéder par défaut qu'aux propriétés et méthodes de niveau public. Ainsi, lorsque nous essayons d'accéder à des propriétés privées, une IllegalAccessException sera levée.

Solution :
Pour résoudre ce problème, nous pouvons accéder aux propriétés privées des deux manières suivantes :

  1. En utilisant la méthode setAccessible()
    setAccessible() est une méthode de la classe AccessibleObject qui nous permet de la contourner au moment de l'exécution Access vérifie même si la propriété est marquée comme privée. L'utilisation de la méthode setAccessible(true) nous permet d'accéder aux propriétés privées. Voici un exemple de code qui utilise la méthode setAccessible() pour obtenir et définir des propriétés privées :
import java.lang.reflect.Field;

public class ReflectionExample {
    private String privateField = "私有属性";

    public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
        ReflectionExample example = new ReflectionExample();
        Field privateField = ReflectionExample.class.getDeclaredField("privateField");
        privateField.setAccessible(true);
        System.out.println("私有属性的值:" + privateField.get(example));
        privateField.set(example, "修改后的值");
        System.out.println("修改后的私有属性的值:" + privateField.get(example));
    }
}
Copier après la connexion

Dans le code ci-dessus, nous obtenons les propriétés privées de la classe en appelant <code>getDeclaredField()< /code> méthode privateField. Ensuite, nous obtenons l'accès à la propriété privée en appelant la méthode setAccessible(true), et obtenons la valeur de la propriété privée en utilisant la méthode get(). Enfin, nous définissons la nouvelle valeur de la propriété privée à l'aide de la méthode set(). getDeclaredField()方法获取到了类的私有属性privateField。然后,我们通过调用setAccessible(true)方法获取对该私有属性的访问权限,并使用get()方法获取到私有属性的值。最后,我们使用set()方法设置私有属性的新值。

  1. 使用getDeclaredFields()方法
    除了通过getDeclaredField()方法获取单个属性,我们还可以使用getDeclaredFields()方法获取到类中所有的属性(包括私有属性),然后根据属性名来访问和更改私有属性的值。下面是一个使用getDeclaredFields()方法获取和设置私有属性的示例代码:
import java.lang.reflect.Field;

public class ReflectionExample {
    private String privateField = "私有属性";

    public static void main(String[] args) throws IllegalAccessException {
        ReflectionExample example = new ReflectionExample();
        Field[] fields = ReflectionExample.class.getDeclaredFields();

        for (Field field : fields) {
            field.setAccessible(true);
            if (field.getName().equals("privateField")) {
                System.out.println("私有属性的值:" + field.get(example));
                field.set(example, "修改后的值");
                System.out.println("修改后的私有属性的值:" + field.get(example));
                break;
            }
        }
    }
}
Copier après la connexion

在上面的代码中,我们通过调用getDeclaredFields()

    Utilisez la méthode getDeclaredFields()

    En plus d'obtenir un seul attribut via la méthode getDeclaredField(), nous pouvons également utiliser la méthode getDeclaredFields() pour obtenir toutes les propriétés de la classe (y compris les propriétés privées), puis accéder et modifier la valeur des propriétés privées en fonction du nom de la propriété. Voici un exemple de code qui utilise la méthode <code>getDeclaredFields() pour obtenir et définir des propriétés privées :

    rrreee🎜Dans le code ci-dessus, nous l'obtenons en appelant getDeclaredFields() code> méthode Toutes les propriétés de la classe. Ensuite, nous parcourons le tableau de propriétés et obtenons et modifions la valeur de la propriété privée en déterminant si le nom de la propriété est cohérent avec le nom de la propriété cible. 🎜🎜Conclusion : 🎜En utilisant la méthode setAccessible() ou la méthode getDeclaredFields(), nous pouvons accéder et manipuler des propriétés privées en réflexion. Cependant, il est important d’éviter d’abuser de la réflexion pour accéder et modifier des propriétés privées afin de maintenir la lisibilité et la sécurité du code. Lorsque vous utilisez la réflexion, vous devez clairement comprendre la conception et le but de la classe réfléchie et essayer de suivre les principes d'encapsulation orientée objet. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal