目次
1. リフレクションとは
3.1 リフレクション関連クラス
どのクラスも Object のサブクラスであり、Object には getClass があるため、
全属性と指定属性に分割
テストオブジェクトを作成します:
値を設定します。リフレクションによる属性の変更、プライベート属性の変更範囲は直接設定できません
リフレクションの仕組みは、どのクラスでも、どのオブジェクトのメソッドやプロパティもすべて呼び出すことができます。メソッドとプロパティ、これ
1. 逆コンパイル: .class–>java
java.lang.Class;
オブジェクトを取得したら、それを使用してオブジェクトを作成します。 newInstance() を通じてパラメータなしのコンストラクターを呼び出し、オブジェクトを作成します。
3.4.1. すべての属性を取得
変更を取得
3.4.2 获取指定属性
传统属性的获取和通过反射获取对比:
ホームページ Java &#&チュートリアル Javaのリフレクションの基本

Javaのリフレクションの基本

Feb 24, 2017 am 09:51 AM
java


1. リフレクションとは


どのクラスでも、このクラスのすべてのメソッドと属性を知ることができ、Any と呼ぶことができます。 のメソッドと属性が /font> の情報を動的に取得し、オブジェクトのメソッドを動的に呼び出すことを Java のリフレクション機構と呼びます。 2. リフレクションの役割

    1. 逆コンパイル: .class–>java
  • 2. リフレクションメカニズムを通じてオブジェクトのプロパティ、メソッド、構築メソッドなどにアクセスします
  • 3. リフレクティブ固有の実装

3.1 リフレクション関連クラス

    java.lang.Class;
  • java.lang.reflect.Constructor;
  • java.lang.reflect.Field;
  • java .lang.reflect.Method;
  • java.lang.reflect.Modifier;
  • 3.2 大きな Class オブジェクトを取得する 3 つの方法

どのクラスも Object のサブクラスであり、Object には getClass があるため、

オブジェクトClassを取得しました -
-public final native Class<?> getClass();

1

2

3

4

5

6

7

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();

    }

}

ログイン後にコピー

3.3 オブジェクトを作成します

Class

オブジェクトを取得したら、それを使用してオブジェクトを作成します。 newInstance() を通じてパラメータなしのコンストラクターを呼び出し、オブジェクトを作成します。

1

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

ログイン後にコピー
ログイン後にコピー
3.4 . データを取得

全属性と指定属性に分割

3.4.1. すべての属性を取得

    変更を取得
    • まず属性のgetModifiers()で変更オブジェクトを取得します
    • 次に、java.long.reflect.Modifier の toString() を介して、クラスと属性の変更 (public、static、final など) が出力されます。
    属性の取得
    • すべての属性の取得: Class オブジェクトの getDeclaedFields() を通じてフィールド化された配列** を返します。
    属性のタイプを取得します:
    • 属性オブジェクト(Fieldオブジェクト)のgetType()を通して
    • 1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      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 クラスで 2 つのプロパティが定義されています。

1

2

3

4

5

6

7

8

9

10

11

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

 

}

ログイン後にコピー
ログイン後にコピー
従来の属性の取得とリフレクションによる取得の比較:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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 の安全なアクセス機構であるアクセスエラーが発生します:

1

2

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 のカプセル化:

1

nameFiled.setAccessible(true);

ログイン後にコピー
ログイン後にコピー

1. リフレクションとは

リフレクションの仕組みは、どのクラスでも、どのオブジェクトのメソッドやプロパティもすべて呼び出すことができます。メソッドとプロパティ、これ

< /font> の情報を動的に取得し、オブジェクトのメソッドを動的に呼び出す方法を Java のリフレクション機構と呼びます。

2. リフレクションの役割

1. 逆コンパイル: .class–>java

  • 2. リフレクションメカニズムを通じてオブジェクトのプロパティ、メソッド、構築メソッドなどにアクセスします

  • 3. リフレクティブ固有の実装

  • 3.1 リフレクション関連クラス

java.lang.Class;

  • java.lang.reflect.Constructor;

  • java.lang.reflect.Field;

  • java .lang.reflect.Method;

  • java.lang.reflect.Modifier;

  • 3.2 大きな Class オブジェクトを取得する 3 つの方法

  • どのクラスも Object のサブクラスであり、Object には getClass があるため、

オブジェクト

を取得しました - Class -

1

2

3

4

5

6

7

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();

    }

}

ログイン後にコピー

3.3 オブジェクトを作成しますpublic final native Class<?> getClass();

Class

オブジェクトを取得したら、それを使用してオブジェクトを作成します。 newInstance() を通じてパラメータなしのコンストラクターを呼び出し、オブジェクトを作成します。

1

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

ログイン後にコピー
ログイン後にコピー

3.4 . データを取得 全属性と指定属性に分割

3.4.1. すべての属性を取得

変更を取得

  • まず属性のgetModifiers()で変更されたオブジェクトを取得します
    • 次に、java.long.reflect.Modifier の toString() を介して、クラスと属性の変更 (public、static、final など) が出力されます。

    • 属性の取得
  • すべての属性の取得: Class オブジェクトの getDeclaedFields() を通じてフィールド化された配列** を返します。
    • 属性のタイプを取得します:
      • 通过属性对象(Field对象)的getType()

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    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 ,是为了下一个测试反射可以打破封装性

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

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

     

    }

    ログイン後にコピー
    ログイン後にコピー

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    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的安全访问机制,报错:

    1

    2

    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的封装性:

    1

    nameFiled.setAccessible(true);

    ログイン後にコピー
    ログイン後にコピー

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


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles