国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&ベース Javaリフレクションを理解する方法

Javaリフレクションを理解する方法

Nov 13, 2019 am 10:19 AM
java

Javaリフレクションを理解する方法

Java リフレクションを理解するにはどうすればよいですか?

概要

Java リフレクションは、メソッド、プロパティ、親クラス、インターフェイスなどのクラスの內(nèi)部情報(bào)を次の場(chǎng)所で取得できるようにするメカニズムです。ランタイム。言い換えれば、リフレクションは本質(zhì)的に「逆」のプロセスです。 new を使用してクラスのインスタンスを作成すると、実際には、このクラスの Class オブジェクトに基づいて、実行時(shí)に Java 仮想マシンによって構(gòu)築されます。Reflection は、クラスの Class オブジェクトを通じてその定義情報(bào)を取得するため、それにアクセスできます。その屬性とメソッドに移動(dòng)し、このクラスの親クラス、どのインターフェイスが実裝されているか、その他の情報(bào)を確認(rèn)します。

クラス クラス

javac を使用すると、.java ファイルを .class ファイルにコンパイルできることがわかっています。この .class ファイルには、クラスの元の定義情報(bào) (親クラス、インターフェイス、コンストラクター、プロパティ、メソッドなど)。 .class ファイルは、実行時(shí)に ClassLoader によって Java 仮想マシン (JVM) にロードされます。.class ファイルがロードされると、JVM はそのクラス オブジェクトを生成します。プログラム內(nèi)で new を通じてインスタンス化するオブジェクトは、実際にはこれは、実行時(shí)に対応する Class オブジェクトに基づいて構(gòu)築されます。正確に言うと、この Class オブジェクトは実際には java.lang.Class ジェネリック クラスのインスタンスです。たとえば、Class オブジェクトは、MyClass クラスの定義情報(bào)をカプセル化した Class インスタンスです。 java.lang.Class クラスには public コンストラクターがないため、このクラスを直接インスタンス化することはできませんが、次のメソッドで Class オブジェクトを取得できます。

次の説明では、People クラスと Student クラスを例として取り上げます。

public class People {
      private String name;
      private int age;
      public People(String name, int age) {
          this.name = name;
              this.age = age;
      }
      public int getAge() {
          return age;
      } 
      public String getName() {
          return name;
      } 
      public void setAge(int age) {
          this.age = age;
      } 
      public void setName(String name) {
          this.name = name;
      }
      public void speak() {
        System.out.println(getName() + " " + getAge());
     }
}
 
public class Student extends People {
  private int grade;
  public Student(String name, int age) {    
    super(name, age);  
  }
  public Student(String name, int age, int grade) {
    super(name, age);            
    this.grade = grade;  
  }      
  public int getGrade() {   
    return grade;  
  }     
  public void setGrade(int grade) {   
    this.grade = grade;  
  }    
  private void learn(String course) {    
    System.out.println(name + " learn " + course);  
  }
}

クラス名から Class オブジェクトを取得します

クラスを知っている場(chǎng)合コンパイル時(shí)の名前で、次のようにその Class オブジェクトを取得できます:

Class<People> peopleClass = People.class;

次のように、クラスの完全パス名に基づいて Class オブジェクトを取得するメソッドもあります:

//假設(shè)People類在com.test包中
Class<People> peopleClass = Class.forName("com.test.People");

Class.forName() メソッドのパラメータはクラスのフルパス名である必要があることに注意してください。実際、「com.test.People をインポート」する限り、フルパスを書き出す手間をかけずに、「People.class」を通じてクラス オブジェクトを直接取得できます。 (Class.forName() メソッドを呼び出すときに、対応するクラスがクラスパス上に見つからない場(chǎng)合は、ClassNotFoundException がスローされます。)

オブジェクト自體を介して Class オブジェクトを取得する

People people = new People("Bill", 18);
Class<People> peopleClass = people.getClass();

Get theリフレクションによるクラス コンストラクター

People の Class オブジェクトを取得すると、この Class オブジェクトを通じて People クラスの元の定義情報(bào)を取得できます。まず、People クラスのコンストラクター オブジェクトを取得します。このコンストラクター オブジェクトを使用して、People オブジェクトを構(gòu)築できます。たとえば、次のコードを Student.java に追加できます。

public static void main(String[] args) {   
  Class<People> pClass = People.class;   
  try {   
    Constructor<People> constructor = pClass.getConstructor(String.class, int.class);     
    People people = constructor.newInstance("Bill", 18);                 
    people.speak();  
  } catch (Exception e) {  
  } 
}

上記では、getConstructor メソッドを呼び出して People クラスのコンストラクター オブジェクトを取得します。これは、取得したいコンストラクターの仮パラメーターの型が取得するためです。は String と int なので、String.class と int.class を渡します。コンストラクター オブジェクトを使用すると、newInstance メソッドを呼び出して people オブジェクトを作成できます。

リフレクションを通じてクラスの Constructor、Method、および Field オブジェクトを取得した後、これらのオブジェクトのメソッドを呼び出す前に、まずこのオブジェクトのアクセス可能フラグを true に設(shè)定して Java 言語アクセス チェックをキャンセルすることに注意してください。反射速度を上げることができます。次のコードに示すように:

Constructor<People> constructor = peopleClass.getConstructor(String.class, 
    int.class);
// 設(shè)置 constructor 的 Accessible屬性為ture以取消Java的訪問檢查
constructor.setAccessible(true);

リフレクションを通じてクラスで宣言されたメソッドを取得します

#現(xiàn)在のクラスで宣言されたメソッドを取得します (親クラスから継承されたメソッドを除く)

現(xiàn)在のクラスで宣言されているすべてのメソッドを取得するには、Class で getDeclaredMethods 関數(shù)を使用します。これにより、現(xiàn)在のクラスで宣言されたすべてのメソッド (プライベート、パブリック、靜的などを含む) が取得され、 Method オブジェクトの配列。各 Method オブジェクトはクラスで宣言されたメソッドを表します。指定されたメソッドを取得するには、getDeclaredMethod(String name, Class...parameterTypes) を呼び出します。次のコードに示すように:

private static void showDeclaredMethods() {  
  Student student = new Student("Bill", 18);   
  //獲取Student類聲明的所有方法 
  Method[] methods = student.getClass().getDeclaredMethods();       
   try {      
      //獲取learnMethod對(duì)象(封裝了learn方法) 
      Method learnMethod = student.getClass().getDeclaredMethod("learn", 
          String.class);                
      //獲取learn方法的參數(shù)列表并打印出來 
      Class<?>[] paramClasses = learnMethod.getParameterTypes() ;        
      for (Class<?> class : paramClasses) {      
        System.out.println("learn方法的參數(shù): " + class.getName());    
      }                
      //判斷l(xiāng)earn方法是否為private 
      System.out.println(learnMethod.getName() + " is private " 
          + Modifier.isPrivate(learnMethod.getModifiers()));   
      //調(diào)用learn方法    
      learnMethod.invoke(student, "Java Reflection");  
    } catch (Exception e) {  
  }
}

現(xiàn)在のクラスと親クラスで宣言されたパブリック メソッドを取得する

現(xiàn)在のクラスと親クラスで宣言されたすべてのパブリック メソッドを取得するには、次のようにします。 getMethods 関數(shù)を呼び出すことができ、指定されたパブリック メソッドを取得するには、getMethod メソッドを呼び出すことができます。次のコードを見てください:

private static void showMethods() { 
  Student student = new Student("mr.simple");    
  // 獲取所有public方法(包括Student本身的和從父類繼承來的)  
  Method[] methods = student.getClass().getMethods();   
  try {    
    //注意,通過 getMethod只能獲取public方法,若嘗試獲取private方法則會(huì)拋出異常 
    Method learnMethod = student.getClass().getMethod("learn", String.class);
  } catch (Exception e) {  
  }
}

リフレクションを通じてクラスに定義されているプロパティを取得します

プロパティの取得は、getMethods() / getDeclaredMethods() メソッドの呼び出しを除いて、メソッドの取得と似ています。 getFields() / getDeclaredFields() メソッドの呼び出しになります。

現(xiàn)在のクラスで定義されている屬性を取得します (親クラスから継承された屬性を除く)

現(xiàn)在のクラスで定義されているすべての屬性を取得するには (プライベート、パブリック、靜的、その他の屬性を含む) Class オブジェクトの getDeclaredFields 関數(shù)を呼び出すことができ、指定された屬性を取得するには、getDeclaredField を呼び出すことができます。次のコードに示すように:

private static void showDeclaredFields() {   
  Student student = new Student("Bill", 18);    
  // 獲取當(dāng)前類中定義的所有屬性  
  Field[] fields = student.getClass().getDeclaredFields();   
  try {    
    // 獲取指定的屬性 
    Field gradeField = student.getClass().getDeclaredField("grade"); 
    // 獲取屬性值 
    System.out.println("The grade is : " + gradeField.getInt(student));    
    // 設(shè)置屬性值    
    gradeField.set(student, 10); 
   } catch (Exception e) { 
  } 
}

現(xiàn)在のクラスと親クラスで定義されているパブリック プロパティを取得する

現(xiàn)在のクラスと親クラスで定義されているすべてのパブリック プロパティを取得するには、次のようにします。次のコードに示すように、 Class オブジェクトの getFields 関數(shù)を呼び出すことができ、指定されたパブリック屬性を取得するには、getField メソッドを呼び出すことができます。

private static void showFields() {  
  Student student = new Student("Bill", 18);            
  // 獲取當(dāng)前類和父類的所有public屬性 
  Field[] publicFields = student.getClass().getFields();        
}

クラスの親クラスと実裝されたインターフェイスを取得します。リフレクションによるクラスによる

獲取父類

調(diào)用Class對(duì)象的getSuperClass方法即可,如以下代碼所示:

Student student = new Student("Bill", 18);
Class<?> superClass = student.getClass().getSuperclass();

獲取所實(shí)現(xiàn)的接口

要知道一個(gè)類實(shí)現(xiàn)了哪些接口,只需調(diào)用Class對(duì)象的getInterfaces方法,如以下代碼所示:

private static void showInterfaces() { 
  Student student = new Student("Bill", 19); 
  Class<?>[] interfaces = student.getClass().getInterfaces();
}

以上がJavaリフレクションを理解する方法の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國語版

SublimeText3 中國語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動(dòng)コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場(chǎng)合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場(chǎng)合はconn.rollback()を呼び出します。同時(shí)に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達(dá)成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお?jiǎng)幛幛筏蓼埂?/p>

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時(shí)刻を取得します。 3。of()メソッドを使用して特定の日付と時(shí)刻を作成します。 4.プラス/マイナスメソッドを使用して、時(shí)間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります?,F(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識(shí)別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動(dòng)的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評(píng)価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場(chǎng)合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號(hào)、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるU(xiǎn)RL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

See all articles