Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

To jest post przetłumaczony przez AI.

제이온

[Java] Koncepcja refleksji i sposób użycia

  • Język pisania: Koreański
  • Kraj referencyjny: Wszystkie kraje country-flag

Wybierz język

  • Polski
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Nederlands
  • हिन्दी
  • Magyar

Tekst podsumowany przez sztuczną inteligencję durumis

  • Refleksja to API, które umożliwia dostęp do informacji o klasach w czasie wykonywania, umożliwiając manipulowanie klasami w dowolny sposób.
  • Dzięki refleksji można tworzyć instancje klas i uzyskiwać dostęp do pól i metod, niezależnie od modyfikatorów dostępu, co jest przydatne zwłaszcza w dużych projektach, gdzie zarządzanie zależnościami odbywa się dynamicznie.
  • Należy jednak pamiętać, że może to naruszać hermetyzację i prowadzić do spadku wydajności, dlatego należy go używać tylko wtedy, gdy jest to konieczne.

Co to jest Reflection?

Reflection to API, które pozwala na tworzenie instancji danej klasy za pomocą obiektu typu Class załadowanego do obszaru sterty i umożliwia dostęp do pól i metod instancji niezależnie od modyfikatorów dostępu.



W tym kontekście załadowana klasa oznacza, że ładowacz klas JVM zakończył ładowanie pliku klasowego i utworzył obiekt typu Classzawierający informacje o tej klasie, który jest przechowywany w obszarze sterty. Należy pamiętać, że różni się to od obiektów tworzonych za pomocą słowa kluczowego new. Jeśli masz problemy z zrozumieniem obiektów typu Class, zapoznaj się z dokumentacją JDK dotyczącą obiektu java.lang.class.


Jak używać Reflection?

Aby móc korzystać z Reflection, najpierw musisz pobrać obiekt typu Class załadowany do obszaru sterty. Istnieją trzy sposoby na to.


  • Pobieranie za pomocą Class.class
  • Pobieranie za pomocą instance.getClass()
  • Pobieranie za pomocą Class.forName("nazwa_klasy")


public class Member {

    private String name;

    protected int age;

    public String hobby;

    public Member() {
    }

    public Member(String name, int age, String hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    public void speak(String message) {
        System.out.println(message);
    }

    private void secret() {
        System.out.println("Hasło to 1234.");
    }

    @Override
    public String toString() {
        return "Member{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", hobby='" + hobby + '\'' +
            '}';
    }
}

public class Main {

    public static void main(String[] args) throws ClassNotFoundException {
        Class memberClass = Member.class;
        System.out.println(System.identityHashCode(memberClass));

        Member member = new Member("Jayon", 23, "Rozwój Darathu");
        Class memberClass2 = member.getClass();
        System.out.println(System.identityHashCode(memberClass2));

        Class memberClass3 = Class.forName("{nazwa_pakietu}.Member");
        System.out.println(System.identityHashCode(memberClass3));
    }
}

// Wynik działania
1740000325
1740000325

Możesz zauważyć, że wszystkie trzy metody zwracają ten sam obiekt typu Class. Niezależnie od użytej metody, wartość skrótu jest taka sama, dlatego możesz wybrać odpowiednią metodę w zależności od sytuacji.


Teraz, korzystając z pobranego obiektu typu Class, możesz tworzyć instancje tej klasy i uzyskiwać dostęp do pól i metod instancji niezależnie od modyfikatorów dostępu. Zacznijmy od utworzenia instancji tej klasy.


public class Main {

    public static void main(String[] args) throws Exception {
        // Wyświetlenie wszystkich konstruktorów klasy Member
        Member member = new Member();
        Class memberClass = member.getClass();
        Arrays.stream(memberClass.getConstructors()).forEach(System.out::println);

        // Utworzenie instancji za pomocą konstruktora domyślnego klasy Member
        Constructor constructor = memberClass.getConstructor();
        Member member2 = constructor.newInstance();
        System.out.println("member2 = " + member2);

        // Utworzenie instancji za pomocą innego konstruktora klasy Member
        Constructor fullConstructor =
            memberClass.getConstructor(String.class, int.class, String.class);
        Member member3 = fullConstructor.newInstance("Jayon", 23, "Rozwój Darathu");
        System.out.println("member3 = " + member3);
    }
}

// Wynik działania
public Member()
public Member(java.lang.String,int,java.lang.String)
member2 = Member{name='null', age=0, hobby='null'}

Możesz użyć metody getConstructor() do pobrania konstruktora i metody newInstance() do dynamicznego utworzenia instancji klasy Member.

Na koniec przyjrzyjmy się, jak uzyskać dostęp do pól i metod instancji niezależnie od modyfikatorów dostępu.

public class Main {

    public static void main(String[] args) throws Exception {
        Member member = new Member("Jayon", 23, "Rozwój Darathu");
        Class memberClass = member.getClass();

        // Dostęp do pól
        Field[] fields = memberClass.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.get(member));
        }
        fields[0].set(member, "Jayon2");
        System.out.println(member);

        // Dostęp do metod
        Method speakMethod = memberClass.getDeclaredMethod("speak", String.class);
        speakMethod.invoke(member, "Testowanie Reflection");

        Method secretMethod = memberClass.getDeclaredMethod("secret");
        secretMethod.setAccessible(true);
        secretMethod.invoke(member);
    }
}

// Wynik działania
Jayon
23
Rozwój Darathu
Member{name='Jayon2', age=23, hobby='Rozwój Darathu'}
Testowanie Reflection

Możesz użyć metody getDeclaredFileds() do pobrania wszystkich zmiennych instancji klasy i metod get() i set() do odczytu i modyfikacji wartości pól. Pamiętaj, że aby uzyskać dostęp do pól z modyfikatorem dostępu private, musisz ustawić wartość true dla parametru metody setAccessible().


Podobnie, możesz użyć metody getDeclaredMethod() do pobrania metod. W tym przypadku musisz przekazać nazwę metody i typy parametrów jako argumenty. Podobnie jak w przypadku pól, aby uzyskać dostęp do metod z modyfikatorem dostępu private, musisz ustawić wartość true dla parametru metody setAccessible(). Na koniec możesz użyć metody invoke() do wywołania pobranej za pomocą API Reflection metody.


Zalety i wady

  • Zalety
    • Reflection zapewnia elastyczność, umożliwiając tworzenie instancji klas i uzyskiwanie dostępu do pól i metod w czasie wykonywania, niezależnie od modyfikatorów dostępu.
  • Wady
    • Reflection narusza zasadę hermetyzacji.
    • Ponieważ instancje są tworzone w czasie wykonywania, typ nie może być sprawdzony w czasie kompilacji.
    • Tworzenie instancji w czasie wykonywania utrudnia śledzenie przepływu programu.
    • Dostęp do pól i metod za pomocą Reflection jest zazwyczaj wolniejszy niż bezpośredni dostęp. (Nie dotyczy to wszystkich sytuacji).


Dlaczego używać Reflection?

API Reflection umożliwia dostęp do informacji o klasach i manipulację nimi w czasie wykonywania. Możliwe jest nawet modyfikowanie pól i metod z modyfikatorem dostępu private. Może się to wydawać naruszeniem zasady hermetyzacji i techniką, której należy unikać.


W niewielkich aplikacjach konsolowych programista może łatwo określić wszystkie obiekty i zależności używane w programie w czasie kompilacji. Jednak w przypadku rozbudowanych frameworków, takich jak Spring, śledzenie wszystkich obiektów i zależności może być trudne. W takich przypadkach Reflection pozwala na dynamiczne tworzenie klas i budowanie zależności.


Na przykład w fabryce Beanów w Spring, wystarczy dodać adnotacje @Controller, @Service, @Repository, aby fabryka Beanów automatycznie tworzyła i zarządzała klasami z tymi adnotacjami. Programista nie musi informować fabryki Beanów o tych klasach, a to możliwe jest dzięki Reflection. W czasie wykonywania, fabryka Beanów skanuje i znajduje klasy z tymi adnotacjami, a następnie tworzy ich instancje za pomocą Reflection, wstrzykuje niezbędne pola i zapisuje je w fabryce Beanów.


Należy jednak pamiętać, że jak wspomniano wcześniej, Reflection narusza zasadę hermetyzacji. Należy go używać tylko w razie potrzeby.


Źródła

제이온
제이온
제이온
제이온
[Efektywny Java] Element 4. Aby zapobiec tworzeniu instancji, użyj prywatnego konstruktora Klasy pomocnicze, które zawierają tylko metody statyczne i pola, powinny mieć ustawiony modyfikator dostępu konstruktora na prywatny, aby zapobiec tworzeniu instancji. Dzięki temu można zapobiec błędnemu postrzeganiu konstruktora jako automatycznie genero

28 kwietnia 2024

[Efektywny Java] Element 5. Użyj wstrzykiwania zależności zamiast jawnego zarządzania zasobami Jeśli klasa zależy od zewnętrznych zasobów, lepiej nie używać singletonów ani statycznych klas narzędzi. Wstrzykiwanie zależności może poprawić elastyczność, ponowne użycie i łatwość testowania klasy, a wzorzec fabryki metod może prowadzić do bardziej wyd

28 kwietnia 2024

[Efektywny Java] Element 3. Gwarantuj singleton za pomocą prywatnego konstruktora lub typu wyliczeniowego W tym artykule przedstawiono trzy sposoby implementacji wzorca singleton w Javie (publiczne statyczne członkowie, statyczne metody fabryczne, typy wyliczeniowe) oraz opisano zalety i wady każdego z nich, a także środki ostrożności dotyczące serializacji.

27 kwietnia 2024

[Javascript] Struktura obiektu (V8) Obiekt JavaScript w silniku V8 jest optymalizowany jak struktura w zależności od stanu, przełączając się między szybkim trybem i trybem słownika, który działa jako mapa skrótów. Szybki tryb jest szybki, gdy klucz i wartość są prawie stałe, ale może spowol
곽경직
곽경직
곽경직
곽경직
곽경직

18 marca 2024

[Bez stopnia, przetrwać jako programista] 14. Podsumowanie często zadawanych pytań na rozmowach kwalifikacyjnych dla początkujących programistów Przewodnik po przygotowaniu do rozmów kwalifikacyjnych dla programistów. Wyjaśnia takie pojęcia często pojawiające się podczas rozmów jak: obszary pamięci głównej, struktury danych, RDBMS i NoSQL, programowanie proceduralne i obiektowe, nadpisywanie i prz
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 kwietnia 2024

SK C&C prezentuje platformę „Solure LLMOps” do tworzenia spersonalizowanych sLLM dla klientów SK C&C wprowadziło na rynek platformę „Solure LLMOps” do tworzenia spersonalizowanych małych modeli językowych (sLLM) dla firm. Platforma ta wykorzystuje różne modele podstawowe, takie jak ChatGPT i HyperCLOVA X, aby ułatwić tworzenie sLLM metodą przeciąg
스타트업 커뮤니티 씬디스 (SeenThis.kr)
스타트업 커뮤니티 씬디스 (SeenThis.kr)
스타트업 커뮤니티 씬디스 (SeenThis.kr)
스타트업 커뮤니티 씬디스 (SeenThis.kr)

20 maja 2024

[Bez stopnia, przetrwanie jako programista] 13. Wywiad techniczny dla początkujących programistów Prezentujemy 7 często zadawanych pytań podczas wywiadu technicznego dla początkujących programistów oraz wskazówki, jak się do niego przygotować. Dowiedz się o pytaniach i strategiach odpowiedzi dotyczących takich dziedzin jak OOP, bazy danych, sieci, alg
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

1 kwietnia 2024

AI Full Stack tworzony z wykorzystaniem open source W ekosystemie AI pojawiają się coraz częściej nowe modele LLM (Large Language Models) z otwartym kodem źródłowym. Mistral, Llama, phi-2 to przykłady modeli o dużej mocy i otwartych licencjach, które zostały udostępnione publicznie. Równolegle rozwijane są
RevFactory
RevFactory
RevFactory
RevFactory

5 lutego 2024

[Nie mając wykształcenia, przetrwaj jako programista] 16. Wskazówki dotyczące tworzenia portfolio dla początkującego programisty Początkujący programiści (szczególnie ci bez wykształcenia) podczas tworzenia portfolio powinni jasno opisywać nie tylko technologie, ale także usługi lub funkcje, które opracowali. Na przykład w przypadku projektu „Społeczność dla osób poszukujących prac
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 kwietnia 2024