Java反射の使用
Java反射せっかくのプロジェクトの中でちょっと技術的なところがあって、半年のjsを書いて、吐きそうになりました.せっかく私に役に立つと思うところがあるので、記録しておきます.
内省と反射の区別反射式Javaクラスの様々な成分を実行状態で対応するJavaクラスにマッピングし,すべての属性を動的に取得し,任意のメソッドを動的に呼び出すことができ,実行状態を強調する.内省メカニズムは反射によって実現され、BeanInfoはbeanの属性、方法、イベントを暴露するために使用され、後でJavaBeanの属性を操作することができます.
Java内省では、基本的に上記のいくつかのクラスが使われています.BeanInfoというクラスでクラスのメソッドと属性を取得できます.具体的にはJDKドキュメントを参照してください.
クラスの変数名に基づいてクラスオブジェクトを取得するgetメソッド
次はネット上の
PropertyDescriptorクラスPropertyDescriptorクラスは、JavaBeanクラスがメモリを介して属性をエクスポートすることを示します.主な方法:1、getPropertyType()で、属性のClassオブジェクトを取得します.2、getReadMethod()は、属性値を読み取る方法を得る.getWriteMethod()は、属性値を書き込む方法を取得します.3.hashCode()は、オブジェクトのハッシュ値を取得する.4、setReadMethod(Method readMethod)、属性値を読み取る方法を設定する.setWriteMethod(MethodwriteMethod)は、属性値を書き込む方法を設定します.ガイドパッケージjava.bean.*;
そして自分のプログラム
まずクラスの変数名を取得し,この変数名を用いてgetメソッドの値を取得しようとするのに最初に最も愚かなメソッドを用いた.変数名を取得し、頭文字を大文字にしてgetName()をつなぎます.getメソッドの名前を取得し、methodメソッドで反射します.しかし、後にIntrospectorソースコードにも、最初の文字列がgetであるか、setであるかによって識別されているのが見えてきました.
変数名に基づいて直接操作できることがわかりました
内省的な方法ですべての
あるいは
内省と反射の区別反射式Javaクラスの様々な成分を実行状態で対応するJavaクラスにマッピングし,すべての属性を動的に取得し,任意のメソッドを動的に呼び出すことができ,実行状態を強調する.内省メカニズムは反射によって実現され、BeanInfoはbeanの属性、方法、イベントを暴露するために使用され、後でJavaBeanの属性を操作することができます.
Java内省では、基本的に上記のいくつかのクラスが使われています.BeanInfoというクラスでクラスのメソッドと属性を取得できます.具体的にはJDKドキュメントを参照してください.
クラスの変数名に基づいてクラスオブジェクトを取得するgetメソッド
次はネット上の
package com.query;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class BeanInfoUtil {
//
public static void setProperty(UserInfo userInfo,String userName)throws Exception{
PropertyDescriptor propDesc=new PropertyDescriptor(userName,UserInfo.class);
Method methodSetUserName=propDesc.getWriteMethod();
methodSetUserName.invoke(userInfo, "wong");
System.out.println("set userName:"+userInfo.getUserName());
}
//
public static void getProperty(UserInfo userInfo,String userName)throws Exception{
PropertyDescriptor proDescriptor =new PropertyDescriptor(userName,UserInfo.class);
Method methodGetUserName=proDescriptor.getReadMethod();
Object objUserName=methodGetUserName.invoke(userInfo);
System.out.println("get userName:"+objUserName.toString());
}
}
PropertyDescriptorクラスPropertyDescriptorクラスは、JavaBeanクラスがメモリを介して属性をエクスポートすることを示します.主な方法:1、getPropertyType()で、属性のClassオブジェクトを取得します.2、getReadMethod()は、属性値を読み取る方法を得る.getWriteMethod()は、属性値を書き込む方法を取得します.3.hashCode()は、オブジェクトのハッシュ値を取得する.4、setReadMethod(Method readMethod)、属性値を読み取る方法を設定する.setWriteMethod(MethodwriteMethod)は、属性値を書き込む方法を設定します.ガイドパッケージjava.bean.*;
そして自分のプログラム
まずクラスの変数名を取得し,この変数名を用いてgetメソッドの値を取得しようとするのに最初に最も愚かなメソッドを用いた.変数名を取得し、頭文字を大文字にしてgetName()をつなぎます.getメソッドの名前を取得し、methodメソッドで反射します.しかし、後にIntrospectorソースコードにも、最初の文字列がgetであるか、setであるかによって識別されているのが見えてきました.
ReportInfo report = reportService.getReport(reportId);
Class> reportInfo = ReportInfo.class;
try {
Method m2 = reportInfo.getMethod(tempNew);//tempNew getName()
String name = m2.invoke(report).toString();
System.out.println(name);// name name
} catch (Exception e) {
e.printStackTrace();
}
変数名に基づいて直接操作できることがわかりました
PropertyDescriptor pd = new PropertyDescriptor(tempparment,report.getClass());
//tempparment
Method m2 = pd.getReadMethod();//Read get()
String name = m2.invoke(report).toString();
内省的な方法ですべての
BeanInfo beanInfo = Introspector.getBeanInfo(ReportInfo.class);
for (PropertyDescriptor p :beanInfo.getPropertyDescriptors()) {
System.out.println(p.getReadMethod().invoke(report,tempparment));
}
あるいは
BeanInfo beninfo = Introspector.getBeanInfo(ReportInfo.class);
//
PropertyDescriptor [] propertydescriptors = beninfo.getPropertyDescriptors();
for(PropertyDescriptor pd:propertydescriptors){
//
System.out.println(pd.getName());
System.out.println(pd.getReadMethod().getName());//
System.out.println(pd.getWriteMethod().getName());//
}