クラス宣言サイクル
Java ソース コード----->javac-------------->Java バイトコード ファイル----- --- ------>java------>クラスオブジェクト(メモリ空間:メタスペース、ローカルメモリ)---------- ----- -------------新規-------->インスタンス化されたオブジェクト---- -gc---- -------->オブジェクトのアンロード
- Object.getClass () (メモリステージ)
- Test.class (メタスペース)
- class.forName("クラスのフルネーム: パッケージ名、クラス名"): メモリ空間(ハードディスク)に入らずにオブジェクトを取得できます。
- オブジェクト名.getClass(): 主にクラスオブジェクトのオブジェクト取得に使用されます
- 概要 : 同じクラスローダーによってロードされたファイルは、プログラム実行中に 1 回だけロードされます。どのメソッドが使用されても、取得されるクラス オブジェクトは同じです。
- コード例:
package com.reflect; public class TestReflectPerson { public static void main(String[] args) throws ClassNotFoundException { //1.class.forName() Class class1=Class.forName("com.reflect.Person"); System.out.println(class1); //2.类名.class Class class2=Person.class; System.out.println(class2); //2.对象名.getClass() Class class3=new Person().getClass(); System.out.println(class3); System.out.println(class1==class2); //true System.out.println(class2==class3); //true } }
クラス object の関数
- アクセス許可が変更されたメンバー変数を取得して設定値を取得します。必須 setAccessible(true) を使用します-----激しい反射
- メンバー メソッド: class object.getDeclaredMethods()実行メソッド invoke(Object object,Object… agrs) (パラメーターの数)は任意、オプション)
//获得构造方法对象, Constructor cons1 = pcla.getDeclaredConstructor(String.class, int.class); Person p2 = (Person)cons1.newInstance("李四",19); System.out.println("p2:"+p2.getName());newInstance() パラメーターのないコンストラクターを作成して、オブジェクトを作成するには、クラス オブジェクトを使用してオブジェクトを作成します。コンストラクター オブジェクトの取得をスキップします。Getクラスの名前を取得します: getName() フルネームを出力します: クラス名パッケージ名 のみ 別のクラス名を出力する場合: getSimpleName()クラスのメンバー変数名を取得する
プロパティ ファイル:コンテンツは等号で接続されます (k=v、
コード例:
package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflectPerson { public static void main(String[] args) throws Exception { /* //1.class.forName() Class class1=Class.forName("com.reflect.Person"); System.out.println(class1); //2.类名.class Class class2=Person.class; System.out.println(class2); //2.类名.getClass() Class class3=new Person().getClass(); System.out.println(class3); System.out.println(class1==class2); System.out.println(class2==class3);*/ //获取对象 Class tclass=Class.forName("com.reflect.Person"); //通过类对象获取成员变量们 Field[] fields = tclass.getDeclaredFields(); System.out.println("获取Person对象的所有属性对象"); for (Field field:fields){ System.out.println(field); } //指定获取Person对象的属性对象 System.out.println("指定获取Person对象的属性对象"); Field age=tclass.getDeclaredField("age"); System.out.println("age:"+age); //通过类对象获取所有的构造方法 Constructor[] constructors = tclass.getDeclaredConstructors(); System.out.println("获取Person的所有构造方法对象"); for (Constructor constructor:constructors){ System.out.println(constructor); } //通过类对象获取无参的构造方法 Constructor constructor = tclass.getDeclaredConstructor(); System.out.println("constructor:"+constructor); //通过类对象获取有参的构造方法 Constructor constructor1 = tclass.getDeclaredConstructor(String.class,int.class); System.out.println("constructor1:"+constructor1); //通过类对象获取所有的成员方法 Method[] methods = tclass.getDeclaredMethods(); for (Method method:methods){ System.out.println("method:"+method); } //通过类对象获取getAge成员方法 Method getAge = tclass.getDeclaredMethod("getAge"); System.out.println("getAge:"+getAge); //通过类对象获取getAge成员方法 Method setAge = tclass.getDeclaredMethod("setAge", int.class); System.out.println("setAge:"+setAge); } }
Get メンバー変数のコード例:
package com.reflect; import java.lang.reflect.Field; public class TestField { public static void main(String[] args) throws Exception { Class pcla=Person.class; /*//获取公共访问权限的成员变量 Field[] fields = pcla.getFields(); for (Field field:fields){ System.out.println("getFild:"+field); } System.out.println(); //获取所有访问权限的成员变量 Field[] fielddes = pcla.getDeclaredFields(); for (Field field:fielddes){ System.out.println("field:"+field); }*/ Field name = pcla.getDeclaredField("name"); System.out.println(name); Person person=new Person(); //暴力反射:获取任意访问权限修饰符的安全检查 name.setAccessible(true); //获取公共成员变量的值 Object value = name.get(person); System.out.println(value); //获取任意访问权限的成员变量的值 Object value2 = name.get(person); System.out.println("value2:"+value2); //设置任意访问权限的成员变量的值 name.set(person,"张三"); Object value3=name.get(person); System.out.println("name:"+value3); } }
プライベート変数の値を取得する方法
//暴力反射:获取任意访问权限修饰符的安全检查 name.setAccessible(true);メインメソッドの有無でプロセスやスレッドを判断するプロセス: 独自のメインメソッドがあり、依存して起動できるこれはプロセスと呼ばれますスレッド: 独自のメイン メソッドがなく、実行するには他のツールに依存する必要があります例: サーブレットを実行する必要がありますTomcate には独自のメイン メソッドがありますリフレクションの背景 (覚えておいてください)例: サーブレットがツール tomcate を使用して実行されるとき、tomacate は実行できませんプロジェクトの実行時にクラスのリソースにアクセスするため、リフレクションが発生します。 tomcate が新しいオブジェクトを取得できない理由
#詳細な説明: tomcate は不可能です。tomacate が生成され、書き込まれているため、new を通じて呼び出されます。最初にクラスを記述し、後でクラスを記述するため、tomcate は new のオブジェクトが何であるかを知りません。パッケージ スキャンを通じてファイル パスを取得できますが、このように new を使用することはできず、リフレクションが発生します。
ate には独自の main メソッドがあります
リフレクションの背景
例: tomacate ツールを使用してサーブレットを実行する場合、tomacate はプロジェクトの実行時にクラスにアクセスできませんリソースが不足し、リフレクションが発生します。
Tomcate が新しいオブジェクトを取得できないのはなぜですか?
詳細な説明: Tomcate は最初に生成されて記述され、クラスは後で記述されるため、new 経由で Tomcate を呼び出すことはできません。そのため、tomcate は new のオブジェクトが何であるかを知りません。パッケージ スキャンを通じて呼び出すことができます。 . を使用してファイルパスを取得しますが、このメソッドでは new が使用できないため、リフレクションが発生します。
Tomcate が doGet メソッドと doPost メソッドを呼び出す必要がある場合、これら 2 つのメソッドは静的ではないため、新しいオブジェクトを通じて呼び出す必要がありますが、Tomcate はオブジェクトを作成できないため、ファイルを取得するためにリフレクションが生成されます
以上がJava リフレクション メカニズムに関する知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

WebStorm Mac版
便利なJavaScript開発ツール

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