JAvaエンジニアリングの蓄積-java反射invoke
4512 ワード
引用:
Javaプロジェクトでは、ORMの概念をたくさん聞いて、私はずっと気にしていましたが、どうしてrsからオブジェクトに変換したのでしょうか.まさか非常に多くの判断を書くのでしょうか.答えは肯定的に否定的で、私たちはどのようにこの問題を解決するかを探求しなければなりません.ちょうど私たちのシステムの下層アーキテクチャを研究している間に、この点を掘り起こしました.今、皆さんと共有します.
詳細:
JAVA反射機構は運転状態において、いずれのクラスに対しても、このクラスのすべての属性と方法を知ることができる.任意のオブジェクトに対して、その任意のメソッドを呼び出すことができます.このような動的に取得され、オブジェクトを動的に呼び出す方法の機能をjava言語の反射メカニズムと呼ぶ.
Java反射メカニズムは主に以下の機能を提供している:実行時に任意のオブジェクトが属するクラスを判定する;実行時に任意のクラスのオブジェクトを構築します.実行時に任意のクラスが持つメンバー変数と方法を判定する.実行時に任意のオブジェクトを呼び出す方法.動的エージェントを生成します.
c.getMethod(「getName」,null)は、クラスまたはインタフェースの指定された共通メンバーメソッドを反映するMethodオブジェクトを返します.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コード:
まとめ:
私达がある実现のために転々として反対侧になって、夜眠れない时、ある日私达は暮れて発见して、もとはこのすべては意外にもこんなに简単で、java本省の构造と底层、无限の美しさが私达を导いて探求して発见します!この過程で、javaという虚しいドアの隙間を解いて、中の果てしない風景を見てみましょう.
プログラミングは奇妙で、时には、私たちが広く、时には、私たちが深く入る必要があります!
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オブジェクトを返します.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という虚しいドアの隙間を解いて、中の果てしない風景を見てみましょう.
プログラミングは奇妙で、时には、私たちが広く、时には、私たちが深く入る必要があります!