Heim Java javaLernprogramm So verbessern Sie die Effizienz der Verwendung von Java Reflection

So verbessern Sie die Effizienz der Verwendung von Java Reflection

Apr 28, 2019 pm 04:33 PM
java反射 效率

In unserer täglichen Arbeit oder in Interviews stoßen wir häufig auf den Wissenspunkt „Reflexion“. Durch „Reflexion“ können wir Objektinformationen dynamisch abrufen und Objektmethoden usw. flexibel aufrufen, aber gleichzeitig, wenn wir sie verwenden Beim Auftauchen eines anderen Lautes erfolgt die „Reflexion“ sehr langsam und sollte sparsam eingesetzt werden. Ist die Reflexion wirklich langsam? Wie viel langsamer ist es, als wenn wir normalerweise Objekte erstellen und Methoden aufrufen? Ich denke, viele Leute haben es noch nie getestet, sie haben es nur „gehört“. Lassen Sie uns die „Reflexion“ anhand einiger Testfälle direkt erleben.

Text

Bereiten Sie das Testobjekt vor

Definieren Sie zunächst eine Testklasse TestUser, die nur die Attribute id und name sowie deren Getter/Setter-Methoden enthält, und a self- Definieren Sie die sayHi-Methode.

public class TestUser {    private Integer id;    private String name;    
    public String sayHi(){        return "hi";
    }    public Integer getId() {        return id;
    }    public void setId(Integer id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }
}
Nach dem Login kopieren

Test zum Erstellen von 1 Million Objekten

// 通过普通方式创建TestUser对象@Testpublic void testCommon(){    long start = System.currentTimeMillis();
    TestUser user = null;    int i = 0;    while(i<1000000){
        ++i;
        user = new TestUser();
    }    long end = System.currentTimeMillis();
    System.out.println("普通对象创建耗时:"+(end - start ) + "ms");
}//普通对象创建耗时:10ms
Nach dem Login kopieren
// 通过反射方式创建TestUser对象@Testpublic void testReflexNoCache() throws Exception {    long start = System.currentTimeMillis();
    TestUser user = null;    int i = 0;    while(i<1000000){
        ++i;
        user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance();
    }    long end = System.currentTimeMillis();
    System.out.println("无缓存反射创建对象耗时:"+(end - start ) + "ms");
}//无缓存反射创建对象耗时:926ms
Nach dem Login kopieren

Bei den beiden oben genannten Testmethoden hat der Autor jede von ihnen fünfmal getestet, einen Durchschnitt ihres Zeitverbrauchs und der Ausgabe ermittelt, die Sie sehen können Das Ergebnis ist, dass eines 10 ms und das andere 926 ms beträgt. Wenn 1 Million Objekte erstellt werden, ist die Reflexion tatsächlich etwa 90-mal langsamer. Was zum Teufel? Ist die Lücke so groß? Ist die Reflexion wirklich so langsam? Als nächstes ändert der Autor die Reflexionshaltung und testet sie weiter, um zu sehen, was das Ergebnis ist?

// 通过缓存反射方式创建TestUser对象@Testpublic void testReflexWithCache() throws Exception {    long start = System.currentTimeMillis();
    TestUser user = null;
    Class rUserClass = Class.forName("RefleDemo.TestUser");    int i = 0;    while(i<1000000){
        ++i;
        user = (TestUser) rUserClass.newInstance();
    }    long end = System.currentTimeMillis();
    System.out.println("通过缓存反射创建对象耗时:"+(end - start ) + "ms");
}//通过缓存反射创建对象耗时:41ms
Nach dem Login kopieren

Tatsächlich können wir anhand des Codes feststellen, dass die Methode Class.forName zeitaufwändiger ist. Sie ruft tatsächlich eine lokale Methode auf, über die die JVM aufgefordert wird, die angegebene Klasse zu finden und zu laden. Wenn wir es im Projekt verwenden, können wir daher das von Class.forName zurückgegebene Klassenobjekt zwischenspeichern und es bei der nächsten Verwendung direkt aus dem Cache abrufen, was die Effizienz beim Abrufen der Klasse erheblich verbessert. Auf die gleiche Weise können wir, wenn wir Konstruktor-, Methoden- und andere Objekte erhalten, diese auch zur Verwendung zwischenspeichern, um eine zeitaufwändige Erstellung bei jeder Verwendung zu vermeiden.

Testen der reflektierenden Aufrufmethode

@Testpublic void testReflexMethod() throws Exception {    long start = System.currentTimeMillis();
    Class testUserClass = Class.forName("RefleDemo.TestUser");
    TestUser testUser = (TestUser) testUserClass.newInstance();
    Method method = testUserClass.getMethod("sayHi");    int i = 0;    while(i<100000000){
        ++i;
        method.invoke(testUser);
    }    long end = System.currentTimeMillis();
    System.out.println("反射调用方法耗时:"+(end - start ) + "ms");
}//反射调用方法耗时:330ms
Nach dem Login kopieren
@Testpublic void testReflexMethod() throws Exception {    long start = System.currentTimeMillis();
    Class testUserClass = Class.forName("RefleDemo.TestUser");
    TestUser testUser = (TestUser) testUserClass.newInstance();
    Method method = testUserClass.getMethod("sayHi");    int i = 0;    while(i<100000000){
        ++i;
        method.setAccessible(true);
        method.invoke(testUser);
    }    long end = System.currentTimeMillis();
    System.out.println("setAccessible=true 反射调用方法耗时:"+(end - start ) + "ms");
}//setAccessible=true 反射调用方法耗时:188ms
Nach dem Login kopieren

Hier reflektieren und rufen wir die sayHi-Methode 100 Millionen Mal auf. Nach dem Aufruf von method.setAccessible(true) stellen wir fest, dass sie fast halb so schnell ist. Wenn wir uns die API ansehen, können wir sehen, dass JDK beim Festlegen des Erfassungsfelds und beim Aufrufen von Methoden Sicherheitszugriffsprüfungen durchführt und solche Vorgänge zeitaufwändig sind. Sie können daher Sicherheitsprüfungen über setAccessible (true) deaktivieren Verbesserung der Reflexionseffizienz.

Ultimative Reflexion

Gibt es zusätzlich zu den oben genannten Methoden eine Möglichkeit, die Reflexion bis zum Äußersten zu nutzen? Hier stellen wir ReflectASM vor, ein leistungsstarkes Reflexions-Toolkit. Es handelt sich um einen Reflexionsmechanismus, der durch Bytecode-Generierung implementiert wird. Im Folgenden finden Sie einen Leistungsvergleich mit der Java-Reflexion.

So verbessern Sie die Effizienz der Verwendung von Java Reflection

Fazit

Abschließend zusammenfassend: Um die Reflektion besser nutzen zu können, sollten wir die relevanten Konfigurationen und Daten, die für die Reflektion erforderlich sind, beim Start des Projekts in den Speicher laden und dann ausführen Jede Stufe ruft diese Metadaten aus dem Cache für Reflektionsvorgänge ab. Sie müssen keine Angst vor Reflexion haben. Solange wir die richtige Methode verwenden, ist sie nicht so langsam wie „gemunkelt“. Verwendung von Paketen von Drittanbietern für den direkten Codebetrieb.

Verwandte Tutorials: Java-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo verbessern Sie die Effizienz der Verwendung von Java Reflection. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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ßer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

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)

Er kann Menschen in zwei Stunden übertreffen! Die neueste KI von DeepMind führt 26 Atari-Spiele im Speedrun aus Er kann Menschen in zwei Stunden übertreffen! Die neueste KI von DeepMind führt 26 Atari-Spiele im Speedrun aus Jul 03, 2023 pm 08:57 PM

Der KI-Agent von DeepMind ist wieder am Werk! Achtung, dieser Typ namens BBF hat 26 Atari-Spiele in nur 2 Stunden gemeistert. Seine Effizienz ist der von Menschen ebenbürtig und übertrifft alle seine Vorgänger. Wissen Sie, KI-Agenten waren bei der Lösung von Problemen durch verstärkendes Lernen schon immer effektiv, aber das größte Problem besteht darin, dass diese Methode sehr ineffizient ist und lange Zeit zum Erkunden benötigt. Bild Der Durchbruch von BBF liegt im Hinblick auf die Effizienz. Kein Wunder, dass der vollständige Name Bigger, Better oder Faster lauten kann. Darüber hinaus kann das Training auf nur einer einzigen Karte durchgeführt werden, und auch der Bedarf an Rechenleistung wird deutlich reduziert. BBF wurde gemeinsam von Google DeepMind und der Universität Montreal vorgeschlagen und die Daten und der Code sind derzeit Open Source. Der höchstmögliche Mensch

Praktischer Leitfaden zur PyCharm-Remote-Entwicklung: Verbessern Sie die Entwicklungseffizienz Praktischer Leitfaden zur PyCharm-Remote-Entwicklung: Verbessern Sie die Entwicklungseffizienz Feb 23, 2024 pm 01:30 PM

PyCharm ist eine leistungsstarke integrierte Python-Entwicklungsumgebung (IDE), die von Python-Entwicklern häufig zum Schreiben von Code, zum Debuggen und zum Projektmanagement verwendet wird. Im eigentlichen Entwicklungsprozess werden die meisten Entwickler mit unterschiedlichen Problemen konfrontiert sein, z. B. wie die Entwicklungseffizienz verbessert werden kann, wie mit Teammitgliedern bei der Entwicklung zusammengearbeitet werden kann usw. In diesem Artikel wird ein praktischer Leitfaden zur Remote-Entwicklung von PyCharm vorgestellt, der Entwicklern dabei hilft, PyCharm besser für die Remote-Entwicklung zu nutzen und die Arbeitseffizienz zu verbessern. 1. Vorbereitungsarbeit in PyCh

Privater Einsatz von Stable Diffusion zum Spielen mit KI-Zeichnung Privater Einsatz von Stable Diffusion zum Spielen mit KI-Zeichnung Mar 12, 2024 pm 05:49 PM

StableDiffusion ist ein Open-Source-Deep-Learning-Modell. Seine Hauptfunktion besteht in der Generierung hochwertiger Bilder durch Textbeschreibungen und unterstützt Funktionen wie Diagrammgenerierung, Modellzusammenführung und Modelltraining. Die Bedienoberfläche des Modells ist in der Abbildung unten zu sehen. So erstellen Sie ein Bild: Beim Erstellen eines Bildes wird es in Aufforderungswörter und negative Aufforderungswörter unterteilt Versuchen Sie, die gewünschte Szene, das gewünschte Objekt, den gewünschten Stil und die gewünschte Farbe klar zu beschreiben. Anstatt nur zu sagen: „Der Hirsch trinkt Wasser“, heißt es „ein Bach, umgeben von dichten Bäumen, und neben dem Bach gibt es Hirsche, die Wasser trinken“. Die negativen Aufforderungswörter lauten beispielsweise in der entgegengesetzten Richtung: Keine Gebäude, keine Menschen, keine Brücken, keine Zäune und eine zu vage Beschreibung können zu ungenauen Ergebnissen führen.

Reverse Engineering mit Java Reflection: Das Innenleben von Software entmystifizieren Reverse Engineering mit Java Reflection: Das Innenleben von Software entmystifizieren Feb 19, 2024 pm 11:20 PM

Java Reflection ist ein leistungsstarkes Tool, mit dem Sie auf die privaten Felder und Methoden einer Klasse zugreifen und so das Innenleben der Software offenlegen können. Dies ist in Bereichen wie Reverse Engineering, Softwareanalyse und Debugging nützlich. Um Java Reflection verwenden zu können, müssen Sie zunächst das Paket java.lang.reflect importieren. Anschließend können Sie die Methode Class.forName() verwenden, um das Class-Objekt einer Klasse abzurufen. Sobald Sie über ein Klassenobjekt verfügen, können Sie verschiedene Methoden verwenden, um auf die Felder und Methoden der Klasse zuzugreifen. Sie können beispielsweise die Methode getDeclaredFields() verwenden, um alle Felder einer Klasse abzurufen, einschließlich privater Felder. Sie können auch die Methode getDeclaredMethods() verwenden

Java-Entwicklungskompetenzen enthüllt: Optimierung der Effizienz der Datenbanktransaktionsverarbeitung Java-Entwicklungskompetenzen enthüllt: Optimierung der Effizienz der Datenbanktransaktionsverarbeitung Nov 20, 2023 pm 03:13 PM

Mit der rasanten Entwicklung des Internets ist die Bedeutung von Datenbanken immer wichtiger geworden. Als Java-Entwickler beziehen wir häufig Datenbankoperationen ein. Die Effizienz der Datenbanktransaktionsverarbeitung steht in direktem Zusammenhang mit der Leistung und Stabilität des gesamten Systems. In diesem Artikel werden einige Techniken vorgestellt, die in der Java-Entwicklung häufig verwendet werden, um die Effizienz der Datenbanktransaktionsverarbeitung zu optimieren und Entwicklern dabei zu helfen, die Systemleistung und Reaktionsgeschwindigkeit zu verbessern. Batch-Einfüge-/Aktualisierungsvorgänge Normalerweise ist die Effizienz des gleichzeitigen Einfügens oder Aktualisierens eines einzelnen Datensatzes in die Datenbank viel geringer als die von Batch-Vorgängen. Daher beim Durchführen von Batch-Einfügungen/-Updates

Beherrschen Sie Python, um die Arbeitseffizienz und Lebensqualität zu verbessern Beherrschen Sie Python, um die Arbeitseffizienz und Lebensqualität zu verbessern Feb 18, 2024 pm 05:57 PM

Titel: Python macht das Leben bequemer: Beherrschen Sie diese Sprache, um die Arbeitseffizienz und Lebensqualität zu verbessern. Als leistungsstarke und leicht zu erlernende Programmiersprache erfreut sich Python im heutigen digitalen Zeitalter immer größerer Beliebtheit. Python kann nicht nur zum Schreiben von Programmen und zur Durchführung von Datenanalysen eine große Rolle in unserem täglichen Leben spielen. Die Beherrschung dieser Sprache kann nicht nur die Arbeitseffizienz verbessern, sondern auch die Lebensqualität verbessern. In diesem Artikel werden spezifische Codebeispiele verwendet, um die breite Anwendung von Python im Leben zu demonstrieren und den Lesern zu helfen

Erfahren Sie, wie Sie Sessionstorage verwenden, um die Effizienz der Front-End-Entwicklung zu verbessern Erfahren Sie, wie Sie Sessionstorage verwenden, um die Effizienz der Front-End-Entwicklung zu verbessern Jan 13, 2024 am 11:56 AM

Um die Rolle von sessionStorage zu beherrschen und die Effizienz der Front-End-Entwicklung zu verbessern, sind spezifische Codebeispiele erforderlich. Mit der rasanten Entwicklung des Internets verändert sich auch der Bereich der Front-End-Entwicklung von Tag zu Tag. Bei der Frontend-Entwicklung müssen wir häufig große Datenmengen verarbeiten und für die spätere Verwendung im Browser speichern. SessionStorage ist ein sehr wichtiges Front-End-Entwicklungstool, das uns temporäre lokale Speicherlösungen bereitstellen und die Entwicklungseffizienz verbessern kann. In diesem Artikel wird die Rolle von sessionStorage vorgestellt.

Subnetzmaske: Rolle und Einfluss auf die Effizienz der Netzwerkkommunikation Subnetzmaske: Rolle und Einfluss auf die Effizienz der Netzwerkkommunikation Dec 26, 2023 pm 04:28 PM

Die Rolle der Subnetzmaske und ihr Einfluss auf die Effizienz der Netzwerkkommunikation. Einführung: Mit der Popularität des Internets ist die Netzwerkkommunikation zu einem unverzichtbaren Bestandteil der modernen Gesellschaft geworden. Gleichzeitig ist auch die Effizienz der Netzwerkkommunikation zu einem Schwerpunkt der Aufmerksamkeit der Menschen geworden. Beim Aufbau und der Verwaltung eines Netzwerks ist die Subnetzmaske eine wichtige und grundlegende Konfigurationsoption, die eine Schlüsselrolle bei der Netzwerkkommunikation spielt. In diesem Artikel werden die Rolle der Subnetzmaske und ihre Auswirkungen auf die Effizienz der Netzwerkkommunikation vorgestellt. 1. Definition und Funktion der Subnetzmaske Subnetzmaske (Subnetzmaske)

See all articles