JAvaproject蓄積——java反射invoke

4638 ワード

鉛:
Javaプロジェクトでは、私たちはすでに多くのORMの概念を聞いて、私はずっと気にしていて、どのように上rsから対象に変換しましたか?まさか非常に多くの推測を書くのですか?答えは否定に違いない.私たちはどのように問題を解決するかを探求しなければなりません.ちょうど私たちのシステムの下位アーキテクチャを研究している間に、この点を掘り起こしました.今、皆さんと共有しています.
詳細:
JAVA反射メカニズムは,実行状態において任意のクラスについて,このクラスのすべての属性と方法を知ることができる.任意のオブジェクトに対して、任意のメソッドを呼び出すことができます.このような動的取得および動的呼び出しオブジェクトのメソッドの機能をjava言語の反射メカニズムと呼ぶ.
Java反射メカニズムは主に以下の機能を提供している:実行時に任意のオブジェクトが属するクラスを判定する;実行時に任意のクラスのオブジェクトを構築します.実行時に任意のクラスが持つメンバー変数と方法を判定する.実行時に任意のオブジェクトを呼び出す方法.動的エージェントを生成します.
<span style="font-size:18px;">package com.java.jvm;
 
 
import java.lang.reflect.*;
 
 
class InvokeTest {
	public static void main(String[] args) {
		 try {
			 Class c = Class.forName("com.java.jvm.User");
			 Object o = c.newInstance();
			 Method m = c.getMethod("getName", null);
			 Object ret = m.invoke(o, null);
			 System.out.println( "com.java.jvm.User.getName() = " + ret);
			  
			  
			 m = c.getMethod("setName", new Class[]{String.class});
			 ret = m.invoke(o, new Object[]{"shengjian"});
			 System.out.println( "com.java.jvm.User.setName() = " + ret);
			  
			  
			 m = c.getMethod("getName", null);
			 ret = m.invoke(o, null);
			 System.out.println( "com.java.jvm.User.getName() = " + ret);
			  
			 //       
			 m = c.getMethod("getUserName", new Class[]{String.class});
			 ret = m.invoke(null, "fuwang");
			 System.out.println( "com.java.jvm.User.getUserName() = " + ret);
		  
		 } catch (ClassNotFoundException ex) {
			System.out.println("      ");
		 } catch (NoSuchMethodException ex) {
			System.out.println("      ");
		 } catch (IllegalAccessException ex) {
			System.out.println("         ");
		 } catch (InvocationTargetException ex) {
			System.out.println("            :
" + ex.getTargetException()); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } }</span>

c.getMethod(「getName」,null)は、Methodオブジェクトを返します.このClassオブジェクトが表すクラスまたはインタフェースの指定された共通メンバーメソッドを反映します.nameパラメータはStringであり、必要なメソッドの略称を指定します.parameterTypeパラメータは、メソッドパラメータタイプを宣言順に識別するClassオブジェクトの配列です.
parameterTypeがnullであると仮定し、空の配列で処理します.
name-メソッド名parameterType-パラメータリストMethodは、クラスまたはインタフェース上の個別のメソッド(およびメソッドへのアクセス方法)に関する情報を提供します.反映されるメソッドは、クラスメソッドまたはインスタンスメソッド(抽象メソッドを含む)である可能性があります.
invoke()
指定されたパラメータを持つ指定されたオブジェクトに対して、このMethodオブジェクトが表す下位メソッドを呼び出します.個々のパラメータは自分で自発的にパケットを解く.基本パラメータと一致するように、基本パラメータと参照パラメータは、必要に応じてメソッドに従って変換を呼び出す.下位メソッドが静的であると仮定すると,指定したobjパラメータは無視できる.このパラメータはnullであってもよい.
下位メソッドに必要な形状パラメータが0であると仮定すると、提供されるargs配列の長さは0またはnullであってもよい.
下位メソッドがインスタンスメソッドであると仮定します.動的メソッド検索を使用して呼び出されます.この点はJava Language Specification,Second Editionの15.12に記録する.4.4節中;ターゲット・オブジェクト・ベースの実行時にタイプの書き換えが発生した場合には、このようにする必要があります.
下位メソッドが静的で、このメソッドを宣言するクラスが初期化されていないと仮定すると、初期化されます.メソッドが正常に完了したと仮定します.メソッドが返す値を呼び出し者に返す.この値が基本タイプであると仮定すると、まずオブジェクトに適切にパッケージされます.
しかし、この値のタイプが基本タイプのセットであると仮定すると、配列要素はオブジェクトにパッケージされない.すなわち、基本タイプの配列が返されます.下位メソッドの戻りタイプがvoidであると仮定すると、呼び出しはnullを返します.
obj-下位メソッドを呼び出すオブジェクトargs-メソッド呼び出しのパラメータ.
Userコード:
<span style="font-size:18px;">package com.java.jvm;
 
public class User {
     
    static{
        System.out.println("static ---");
    }
     
    public User(){
        System.out.println("name="+name);
        name="xiaotian";
    }
     
    private String name;
    private Integer age;
    private String address;
     
    public static String getUserName(String name){
        return name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", address=" + address
                + "]";
    }
     
}</span>

まとめ:
私たちはある実現のために転々としている.夜眠れない時.ある日私たちは暮れて発見した.このすべてがこんなに簡単だったのか、java本省のアーキテクチャと最下位だった.無限の美しさが私たちを導いて探求して発見します!
この過程で、javaという虚しいドアの隙間を解いて、中の果てしない風景を見てみましょう.
プログラミングは非常に奇妙で、時には.私たちは広い範囲が必要です.時には、深さが必要です.
本文のブログのオリジナルの文章.ブログは、同意を得ずに転載してはならない.