スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaBeansの情報を取得する

JavaBeansのプロパティ、getter/setterを取得するコード。


package meta_pg;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class Sample022 {

public static void main(String[] args) throws Exception{

BeanInfo beanInfo = Introspector.getBeanInfo(Foo022.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

for(PropertyDescriptor pd: propertyDescriptors){

System.out.println("Property :" + pd.getName());
System.out.println("Getter :" + pd.getReadMethod());
System.out.println("Setter" + pd.getWriteMethod() );
}

}

}

final class Foo022{

private int foo;

private boolean bar;

private Object baz;
//getter/setter
public int getFoo() {
return foo;
}

public void setFoo(int foo) {
this.foo = foo;
}

public boolean isBar() {
return bar;
}

public void setBar(boolean bar) {
this.bar = bar;
}

public Object getBaz() {
return baz;
}

public void setBaz(Object baz) {
this.baz = baz;
}



}



実行結果

Property :bar
Getter :public boolean meta_pg.Foo022.isBar()
Setterpublic void meta_pg.Foo022.setBar(boolean)
Property :baz
Getter :public java.lang.Object meta_pg.Foo022.getBaz()
Setterpublic void meta_pg.Foo022.setBaz(java.lang.Object)
Property :class
Getter :public final native java.lang.Class java.lang.Object.getClass()
Setternull
Property :foo
Getter :public int meta_pg.Foo022.getFoo()
Setterpublic void meta_pg.Foo022.setFoo(int)
スポンサーサイト

フィールドを動的に取得する

動的にフィールドを取得する。
インナークラスでフィールドを列挙するメソッドを定義している。


package meta_pg;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
//Sample008
public class Sample008 {

public static void main(String[] args) throws Exception{
String toString = ToStringBuilder.toString(new Foo008());
System.out.println(toString);
}

public static class ToStringBuilder{
public static String toString(Object o){
StringBuilder sb = new StringBuilder();
sb.append("ClassName:" + o.getClass().getName());

Field[] declaredFields = o.getClass().getDeclaredFields();
try{
sb.append("FieldName:");
for (Field field: declaredFields){
field.setAccessible(true);//privateフィールドにアクセスできるようにする

String crlf = System.getProperty("line.separator");//改行コード
sb.append(crlf);
sb.append(field.getName()+ "=" + field.get(o) );
}
}catch(IllegalAccessException ex){
//ignore
}
return sb.toString();
}
}
}
//Foo008
final class Foo008{
private int foo = 1;

private String bar = "str";

private List baz = new ArrayList();
}



実行結果

ClassName:meta_pg.Foo008FieldName:
foo=1
bar=str
baz=[]

動的にメソッドを実行する

java.lang.reflect.Method#invokeメソッドによって動的にメソッドを実行する。
toStringもオーバーライドして、formのプロパティを参照できるようにしている。


package meta_pg;

import java.lang.reflect.Method;

public class Sample007 {

public static void main(String[] args) throws Exception{
String methodName0 = args[0];
String methodName1 = args[2];
String value0 = args[1];
String value1 = args[3];

FooForm007 form = FooForm007.class.newInstance();

Method method = FooForm007.class.getMethod(methodName0, String.class);
method.invoke(form, value0);
System.out.println(form);

method = FooForm007.class.getMethod(methodName1, String.class);
method.invoke(form, value1);
System.out.println(form);
}

}

final class FooForm007{

private String foo;

private String bar;
//getter/setter
public String getFoo() {
return foo;
}

public void setFoo(String foo) {
this.foo = foo;
}

public String getBar() {
return bar;
}

public void setBar(String bar) {
this.bar = bar;
}
@Override
public String toString(){
return foo + " " + bar;
}
}




実行結果 (引数は setFoo test1 setBar test2)

test1 null
test1 test2

リフレクションAPI getAnnotations


package meta_pg;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;

public class Sample005 {

/**
* @param args
*/
public static void main(String[] args) {
// アノテーションを取得して列挙
Class clazz = MyClass006.class;
Annotation[] annotations = clazz.getAnnotations();
for(Annotation annotation : annotations){
System.out.println(annotation);
}

}

}
@Deprecated
final class MyClass006 {
@SuppressWarnings("unchecked")
//SuppressWarningsは取得されない?
List hoge = new ArrayList();
}



実行結果

@java.lang.Deprecated()



アノテーションとは?

注釈。クラスやメソッドに付与する関連情報(メタデータ)のこと。

リフレクションAPI getDeclaredConstructor


package meta_pg;

import java.lang.reflect.Constructor;

public class Sample004 {

/**
* @param args
*/
public static void main(String[] args) throws NoSuchMethodException {
// コンストラクタを取得する
Class clazz = String.class;
Constructor constructor = clazz.getDeclaredConstructor(String.class);
System.out.println(constructor);

try{
//存在しないコンストラクタを取得する
Constructor constructor2 = clazz.getDeclaredConstructor(byte.class);
}catch(NoSuchMethodException ex){
ex.printStackTrace();
}
}
}


実行結果

public java.lang.String(java.lang.String)
java.lang.NoSuchMethodException: java.lang.String.(byte)
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getDeclaredConstructor(Class.java:1985)
at meta_pg.Sample004.main(Sample004.java:18)
プロフィール

tjnet777

Author:tjnet777
Solaris, VPNのサポート業務を1年

金融系SIerで業務アプリの開発、メンテを3年半

離職して大学院大学 1年生

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。