Heim > Java > javaLernprogramm > Reflexionsgrundlagen von Java

Reflexionsgrundlagen von Java

黄舟
Freigeben: 2017-02-24 09:51:16
Original
1084 Leute haben es durchsucht


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 Class<?> 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();
    }
}
Nach dem Login kopieren

 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();
Nach dem Login kopieren
Nach dem Login kopieren

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()
      < des Attributobjekts ( Feldobjekt) 🎜>
    • 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("}");
Nach dem Login kopieren
Nach dem Login kopieren

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...

}
Nach dem Login kopieren
Nach dem Login kopieren
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));

    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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"
Nach dem Login kopieren
Nach dem Login kopieren
1. Was ist Reflexion?

  Der Reflexionsmechanismus befindet sich im
nameFiled.setAccessible(true);
Nach dem Login kopieren
Nach dem Login kopieren
Laufzustand

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

< Das dynamische Aufrufen des Objekts wird als Java-Reflexionsmechanismus bezeichnet.

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

<🎜 erhalten >Objekt

-

-Class
3.3 Objekte erstellenpublic final native Class<?> 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();
    }
}
Nach dem Login kopieren
-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();
Nach dem Login kopieren
Nach dem Login kopieren
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("}");
    Nach dem Login kopieren
    Nach dem Login kopieren

    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...
    
    }
    Nach dem Login kopieren
    Nach dem Login kopieren

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

    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));
    
        }
    }
    Nach dem Login kopieren
    Nach dem Login kopieren

    通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
    会出现访问错误, 也就是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"
    Nach dem Login kopieren
    Nach dem Login kopieren

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

    nameFiled.setAccessible(true);
    Nach dem Login kopieren
    Nach dem Login kopieren

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


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage