Heim  >  Artikel  >  Java  >  Reflexionsgrundlagen von Java

Reflexionsgrundlagen von Java

黄舟
黄舟Original
2017-02-24 09:51:161048Durchsuche


1. Was ist Reflexion?


Der Reflexionsmechanismus befindet sich für jeden im Laufzustand Klasse, Sie können alle Methoden und Attribute dieser Klasse für jedes Objekt kennen. Sie können jede ihrer Methoden und Attribute aufrufen Javas Reflexionsmechanismus.

2. Die Rolle der Reflexion

  • 1. Dekompilieren: .class–>java

  • 2 , Zugriff auf die Eigenschaften, Methoden, Konstruktionsmethoden usw. von Objekten über den Reflexionsmechanismus

3. Spezifische Implementierung der Reflexion

1 Reflexionsbezogene Klassen

  • java.lang.Class;

  • java.lang.reflect.Constructor;

  • java .lang.reflect .Field;

  • java.lang.reflect.Method;

  • java.lang.reflect.Modifier;

3.2 Drei Möglichkeiten, große Klassenobjekte zu erhalten

Da jede Klasse eine Unterklasse von Object ist und getClass in Object vorhanden ist, können Sie

ObjektClass -
-public final native Class6b3d0130bba23ae47fe2b8e8cddf0195 getClass();

3.3 Objekte erstellen
package com.chb.reflectTest;public class Test {
    public static void main(String[] args) throws Exception {        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");    //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}

 Nachdem Sie das

Class

-Objekt erhalten haben, verwenden Sie es zum Erstellen eines Objekts und rufen Sie den parameterlosen Konstruktor über newInstance() auf, um das zu erstellen object, newInstance( ) Gibt ein Objekt zurück:

3.4. Daten abrufen
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();

Aufgeteilt in alle Attribute und angegebenen Attribute

3.4.1 🎜>

Änderungen abrufen
  • Zuerst das Änderungsobjekt über getModifiers() des Attributs abrufen,
    • und übergeben Sie dann toString() von java.long.reflect.Modifier, um Klassen und Attributänderungen (öffentlich, statisch, endgültig usw.) auszugeben.
    • Attribute abrufen
  • Alle Attribute abrufen: über getDeclaedFields() des Klassenobjekts ein Fielded-Array zurückgeben* *.
    • Erhalten Sie den Typ des Attributs:
  • Über getType()
    • 3.4.2 Erhalten Sie das angegebene Attribut
Erstellen Sie ein Testobjekt:
Class<?> cString = Class.forName("java.lang.String");
        //获取累的修饰和名称
        System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
        //获取所有属性
        Field[] fields = cString.getDeclaredFields();
        for (Field field : fields) {
            System.out.print("\t");
            System.out.print(
                    Modifier.toString(field.getModifiers())+" "//属性的修饰
                  + field.getType().getSimpleName()+" "
                  + field.getName()+"\n");           
        }
        System.out.println("}");

Hinweis: Ich habe zwei Attribute in definiert Die Verwendungsklasse, eine öffentliche und eine private, ist für den nächsten Test, ob Reflexion die Kapselung durchbrechen kann


Vergleich zwischen traditionellem Attributerwerb und Erwerb durch Reflexion:

package com.chb.reflectTest;public class User {    
private String name;    
public  String nickName;    
public User() {}    
public User(String name, String nickName) {        
this.name = name;        
this.nickName = nickName;
    }
    setter getter...

}
Durch Reflektion festgelegt Der Wert des Attributs unterscheidet den Änderungsbereich des Attributs.

Es tritt ein Zugriffsfehler auf. Der Fehler wird gemeldet:

package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
    public static void main(String[] args) throws Exception {
        //传统获取属性的值
        //1、通过getter,setter
        User user1 = new User();
        user1.setName("lisi");
        System.out.println(user1.getName());
        //2、直接调用属性
        User user2 = new User();
        user2.nickName = "癞皮狗";
        System.out.println(user2.nickName);
        //=========================================
        //通过反射来设置,获取属性。
        Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
        User user = c1.newInstance();
        Field nickField = c1.getDeclaredField("nickName");
        nickField.set(user, "123");
        System.out.println(nickField.get(user));

        Field nameFiled = c1.getDeclaredField("name");
        //Exception in thread "main" java.lang.IllegalAccessException: 
        Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
        nameFiled.setAccessible(true);
        nameFiled.set(user, "oup");
        System.out.println(nameFiled.get(user));

    }
}

Wir verwenden eine Methode, um die Kapselung von Java zu unterbrechen:

Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.
User with modifiers "private"
1. Was ist Reflexion?

  Der Reflexionsmechanismus befindet sich im
nameFiled.setAccessible(true);
Laufzustand

. Für jede Klasse können Sie alle Methoden und Attribute jedes Objekts aufrufen. Diese

705afb6206307d223b8a0fb563875836java
  • 2 , Zugriff auf die Eigenschaften, Methoden, Konstruktionsmethoden usw. von Objekten über den Reflexionsmechanismus

  • 3. Spezifische Implementierung der Reflexion

  • 1 Reflexionsbezogene Klassen

java.lang.Class;

  • java.lang.reflect.Constructor;

  • java .lang.reflect .Field;

  • java.lang.reflect.Method;

  • java.lang.reflect.Modifier;

  • 3.2 Drei Möglichkeiten, große Klassenobjekte zu erhalten

  • Da jede Klasse eine Unterklasse von Object ist und getClass in Object vorhanden ist, können Sie

Objekt

-

-Class
3.3 Objekte erstellenpublic final native Class6b3d0130bba23ae47fe2b8e8cddf0195 getClass();
 Nachdem Sie das

Class
package com.chb.reflectTest;public class Test {
    public static void main(String[] args) throws Exception {        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");        //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}
-Objekt erhalten haben, verwenden Sie es zum Erstellen eines Objekts und rufen Sie den parameterlosen Konstruktor über newInstance() auf, um das zu erstellen object, newInstance( ) Gibt ein Object-Objekt zurück:

3.4. Daten abrufen   Aufgeteilt in alle Attribute und angegebenen Attribute

Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
3.4.1 🎜>

Änderungen abrufen

  • Zuerst das Änderungsobjekt über getModifiers() des Attributs abrufen,

    • und übergeben Sie dann toString() von java.long.reflect.Modifier, um Klassen und Attributänderungen (öffentlich, statisch, endgültig usw.) auszugeben.
    • Attribute abrufen

  • Alle Attribute abrufen: über getDeclaedFields() des Klassenobjekts ein Fielded-Array zurückgeben* *.

    • Rufen Sie den Attributtyp ab:

      • 通过属性对象(Field对象)的getType()

    Class<?> cString = Class.forName("java.lang.String");
            //获取累的修饰和名称
            System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
            //获取所有属性
            Field[] fields = cString.getDeclaredFields();
            for (Field field : fields) {
                System.out.print("\t");
                System.out.print(
                        Modifier.toString(field.getModifiers())+" "//属性的修饰
                      + field.getType().getSimpleName()+" "
                      + field.getName()+"\n");           
            }
            System.out.println("}");

    3.4.2 获取指定属性

    创建测试对象:
    注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性

    package com.chb.reflectTest;public class User {    
    private String name;    
    public  String nickName;    
    public User() {}    
    public User(String name, String nickName) {        
    this.name = name;        
    this.nickName = nickName;
        }
        setter getter...
    
    }

    传统属性的获取和通过反射获取对比:

    package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
        public static void main(String[] args) throws Exception {
            //传统获取属性的值
            //1、通过getter,setter
            User user1 = new User();
            user1.setName("lisi");
            System.out.println(user1.getName());
            //2、直接调用属性
            User user2 = new User();
            user2.nickName = "癞皮狗";
            System.out.println(user2.nickName);
            //=========================================
            //通过反射来设置,获取属性。
            Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
            User user = c1.newInstance();
            Field nickField = c1.getDeclaredField("nickName");
            nickField.set(user, "123");
            System.out.println(nickField.get(user));
    
            Field nameFiled = c1.getDeclaredField("name");
            //Exception in thread "main" java.lang.IllegalAccessException: 
            Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
            nameFiled.setAccessible(true);
            nameFiled.set(user, "oup");
            System.out.println(nameFiled.get(user));
    
        }
    }

    通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
    会出现访问错误, 也就是java的安全访问机制,报错:

    Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.
    User with modifiers "private"

    我们通过一个方法·来打破java的封装性:

    nameFiled.setAccessible(true);

     以上就是java之反射基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Erweiterte Java-ReflektionNächster Artikel:Erweiterte Java-Reflektion