Inhaltsverzeichnis
1. Was ist Reflexion?
 Nachdem Sie das
Aufgeteilt in alle Attribute und angegebenen Attribute
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
Es tritt ein Zugriffsfehler auf. Der Fehler wird gemeldet:
. Für jede Klasse können Sie alle Methoden und Attribute jedes Objekts aufrufen. Diese
1. Dekompilieren: .class–>java
java.lang.Class;
<🎜 erhalten >Objekt
3.4.2 获取指定属性
传统属性的获取和通过反射获取对比:
Heim Java javaLernprogramm Reflexionsgrundlagen von Java

Reflexionsgrundlagen von Java

Feb 24, 2017 am 09:51 AM
java


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)!


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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Feb 07, 2025 pm 12:11 PM

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo

See all articles