1.反射されるどのような
機構反射Java言語、そのような機構を動的にインスタンス化することができるオブジェクト属性、メソッド呼び出し
student.javaの
SID。
名;
User.javaの
UID。
名;
.....
のjava.lang.Class
をjava.lang.reflect.Field
java.lang.reflect.Methodオブジェクト
java.lang.reflect.construct
类Student.java User.java实例...
2.クラス
のすべてのクラス犬犬犬カイオブジェクト
すべての猫猫猫クラスはFIBBLEオブジェクト
の特定のクラスのクラスのjava.lang.Classクラスオブジェクトのクラスを
クラスから得られた3.すべての反射に関連するコード(のjava.lang.Class)オブジェクトが始まる
3.1 Class.forNameの(完全なクラス名)
3.2クラス名の.class
3.3オブジェクト.getClassを()
注1:ClassNotFoundExceptionが(クラス名が間違っ|小さな瓶パッケージ)
注2:同じクラス、クラスオブジェクトが作成されます。
反射3の4効果(れるjava.lang.reflectを。*)
4.1オブジェクトインスタンス
(c.newInstance)を
Constructor.getConstructor / Constructor.getDeclaredConstructorの
注:非引数のコンストラクタを提供するようにしてください
4.2動的メソッド呼び出し
方法、M;
m.invokeを
4.3書き込み属性
フィールドセット/取得
5.アクセス修飾子
getModifiers()
プライベートは
保護され
、静的な
決勝
.....
メンバーが変更されているもの、それを修飾子を知ってどのように反映しますか?
エンティティクラスStudent.java
パッケージcom.huangyucan.reflect; パブリック クラスの学生{ プライベート文字列のSID; プライベート文字列SNAME、 公共整数年齢、 静的{ System.out.printlnは( "JVMにロードされた!" ); } 公共の学生(){ スーパー(); System.out.println(「学生オブジェクトを作成するために、引数なしでコンストラクタを呼び出す」); } 公共の学生(文字列SID){ スーパー(); この .SID = SID; のSystem.out.printlnは(「パラメータと呼んコンストラクタは、学生のオブジェクト」を作成します); } 公共学生(SID文字列、文字列SNAME){ スーパー(); この .SID = SID; この .sname = SNAME; のSystem.out.println( "2つのパラメータのコンストラクタは、学生オブジェクトを作成してメソッドが呼び出されました" ); } @SuppressWarnings(「未使用」) 、プライベート学生(整数年齢){ するSystem.out.println(「プライベートコール学生クラスのコンストラクタは、学生オブジェクトを作成」); この .age = 年齢; } パブリック文字列GETSID(){ 戻りSIDを; } 公共 ボイドがsetsid(文字列SID){ この .SID = SID; } パブリック文字列getSname(){ 戻りSNAME。 } 公共 ボイドsetSname(文字列SNAME){ この .sname = SNAME。 } パブリック 無効のhello(){ System.out.printlnは( "你好我是!" + この.sname)。 } パブリック 無効ハロー(文字列名){ System.out.printlnは(名前 + "你好我是!" + この.sname)。 } @SuppressWarnings( "未使用" ) プライベート整数(整数、整数B)を追加{ 戻り 新しい整数(a.intValue()+ b.intValue())。 } @Override パブリック文字列のtoString(){ リターン "学生[SID =" + SID + "SNAME =" + SNAME + "年齢=" +年齢+ "]" 。 } }
1、オブジェクトクラスクラスクラス取得モードDemo1.java
com.huangyucan.reflectパッケージ;
/ **
*どのクラスオブジェクト(3つの方法で)取得する
*。1、Class.forNameの( "フル・パスタイプ")、JDBC、カスタムMVCフレームワーク
* 2、クラスが.classファイルの一般的なお問い合わせにはない
、クラスのインスタンスを* 3。 getClass()共通のCRUD操作を行う
*管理@author
*
* /
publicクラスDEMO1 {
静的な無効メインパブリック(文字列[]引数)は、ClassNotFoundExceptionがスロー{
//クラス= CLZ Class.forNameの( "com.huangyucan.reflect.Student")<?>;
//クラスStudent.class CLZ = <?>;
スチューデントSTU ;)(=新しい新学生
)= stu.getClass CLZクラス(<?>;
System.out.printlnは(CLZ);
}
/ **
* Class.forNameの( "com.jdbc.mysql.Driver"を使用するのはなぜJDBC接続);
それは必ずしものJDBCドライバインターフェースを実装する必要がある; * ...かどうか、OracleドライバMySQLドライバが運転
に、java.sql.driverを拡張* com.jdbc.mysql.Driverを
* Dに、java.sql.driver Class.forNameの=( "com.jdbc.mysql.Driver")
*
*
* web.xmlの
*の<servlet>
* <サーブレット名> XXXの<servlet-name>の
*の<servlet-class>のcom.huangyucan.XxxServlet </サーブレットクラス>
* </サーブレット>
* ...
*
* com.huangyucan.XxxServletが伸びるのHttpServlet
*クラスCLZ = Class.forNameの( "com.huangyucan.XxxServlet")<?>;
* HttpServletをhttservlet = clz.newInstanse()。
*
* XxxServlet实例
*新しいXxxServlet();
* /
}
Demo2.javaの反射によって、例えば図2に示すように、
パッケージcom.huangyucan.reflect; インポートjava.lang.reflect.Constructor; / ** *反射インスタンス化 * 1、クラスが未知のインスタンス化することができる 2 *、プライベートインスタンスコンストラクタによって作成することができます * @author 管理 * * / パブリック クラスDEMO2 { 公共 静的 ボイドメイン(文字列[]引数)をスロー例外{ クラスCLZを =学生。クラス; // 反射学生オブジェクトを作成するために、引数なしでコンストラクタを呼び出すため // )(学生STU =(学生)clz.newInstance。 // クラスのコンストラクタ取得する // コンストラクタclz.getConstructor = CON(String.classを)。 // オブジェクトコンストラクタインスタンス化することによって、 // オブジェクトのnewInstance = con.newInstance( "S001を"); // Studentオブジェクトを作成するには、2つの引数を持つコンストラクタ呼び出し // コンストラクタCON = clz.getConstructor(String.classを、 String.class); // // オブジェクトコンストラクタインスタンス化 // 学生STU =(学生)con.newInstance( "S001"、 "ZSを"); // java.lang.NoSuchMethodException // (のみgetConstructorを発見修飾されたパブリックコンストラクタ、getDeclaredConstructor)は、任意の修飾子を見つけることができる // コンストラクタclz.getConstructor = CON(Integer.class); コンストラクタclz.getDeclaredConstructorのCON =(整数。クラス); con.setAccessible(trueに); // オブジェクトのコンストラクタインスタンス化することによって 学生STU =(学生)con.newInstanceを(12である); のSystem.out.println(STU); } }
図3に示すように、反射法を呼び出すDemo3.java
パッケージcom.huangyucan.reflect。 輸入java.lang.reflect.Methodオブジェクト。 / ** *反射调用方法 * AddOrderServlet * DelOrderServlet * * - > OrderServlet * JSP - > methodNameの *のdoPost *文字列methodNameの= req.getParameter( "methodNameの")。 * IF( "追加" .equals(methodNameの)){ * *}そうであれば( "デル" .equals(methodNameの)){ *デル(REQ、RESP)。 *} * * ---> *デル(REQ、RESP)。 *(REQ、RESP)を追加します。 * * @authorの管理 * / パブリック クラスDemo3 { 公共の 静的な 無効メイン(文字列[]引数)スロー例外{ 学生STU = 新しい新しい学生(); // stu..hello(); クラスCLZ = stu.getClass(); // 方法であって、M = clz.getDeclaredMethod( "こんにちは")。 // m.invoke(STU); メソッド、M = clz.getDeclaredMethod( "こんにちは"、文字列。クラス) のSystem.out.println(m.invoke(STU、 "ZS" )); // 方法であって、M = CLZ。 getDeclaredMethod(「追加」、Integer.class、Integer.class); // m.setAccessible(真の); // 呼び出し:メソッドは、リフレクションの動的呼び出しを無効に変更された場合には、戻りはnullです // この方法は、動的にボイド変更しない反射呼び出された場合、方法は戻り値を返すために呼び出される // ;呼び出し= m.invoke(STU、20、5)オブジェクト // するSystem.out.printlnを( )を呼び出します; } }
図4に示すように、反射読み書きプロパティDemo4.java
パッケージcom.huangyucan.reflect; インポートをjava.lang.reflect.Fieldなど; / ** *反射属性の割り当ての値 * JSP * - >は、uname、性別、年齢、パスワード、電話番号、住所.... *サーブレット *文字列= req.getParameter名( "のuname"); *文字列セックス= req.getParameter( "性別"); * ... * U =新たな新しいユーザーのユーザー(); * u.setName(のuname); * u.setSex (性別); * ... * * - > *カプセル化JSPパラメータエンティティクラス上に反射されたエネルギーを通過 * * @author 管理 * * / パブリック クラスDemo4 { 公共 静的 ボイドメイン(文字列[]引数)スロー例外{ 学生STU = 新しい生徒( "S002"、 "LS" )。 // stu.setSid( "S001")。 stu.age = 22 。 // するSystem.out.println(STU)。 クラスCLZ = stu.getClass()。 // フィールドフィールド= clz.getDeclaredField( "SID"); // field.setAccessible(真の); // field.set(STU、 "S002")。 // するSystem.out.println(STU)。 フィールド[]フィールド = clz.getDeclaredFields()。 用{(フィールドフィールドフィールド) フィールド。 System.out.println(field.getName() + ":" + field.get(STU)); } } }