/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.seasar.util.beans;
import java.lang.reflect.Constructor;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Map;
import org.seasar.util.beans.factory.BeanDescFactory;
/**
* JavaBeansのメタデータを扱うためのインターフェースです。
* <p>
* {@link BeanDesc}のインスタンスは{@link BeanDescFactory}から取得します。
* <p>
*
* <pre>
* BeanDesc beanDesc = BeanDescFactory.getBeanDesc(Foo.class);
* </pre>
* <p>
* 取得した{@link BeanDesc}から,対象となるJavaBeansのプロパティやフィールド、コンストラクタ、メソッドのメタデータを取得できます。
* </p>
*
* <pre>
* for (PropertyDesc propertyDesc : beanDesc.getPropertyDescs()) {
* propertyDesc.getValue(foo); // Foo のプロパティの値を取得
* }
*
* for (FieldDesc fieldDesc : beanDesc.getFieldDescs()) {
* fieldDesc.getFileldValue(foo); // Foo のフィールドの値を取得
* }
*
* for (ConstructorDesc constructorDesc : beanDesc.getConstructorDescs()) {
* constructorDesc.newInstance(...); // Foo のインスタンスを生成
* }
*
* for (String methodName : beanDesc.getMethodNames()) {
* for (MethodDesc methodDesc : beanDesc.getMethodDescs(methodName)) {
* methodDesc.invoke(foo, ...); // Foo のメソッドを起動
* }
* }
* </pre>
*
* @author higa
* @see BeanDescFactory
*/
public interface BeanDesc {
/**
* Beanのクラスを返します。
*
* @param <T>
* Beanのクラス
* @return Beanのクラス
*/
<T> Class<T> getBeanClass();
/**
* 型変数から型引数へのマップを返します。
*
* @return 型変数から型引数へのマップ
*/
Map<TypeVariable<?>, Type> getTypeVariables();
/**
* {@link PropertyDesc}を持っているかどうかを返します。
*
* @param propertyName
* プロパティ名。{@literal null}や空文字列であってはいけません
* @return {@link PropertyDesc}を持っているかどうか
*/
boolean hasPropertyDesc(String propertyName);
/**
* {@link PropertyDesc}を返します。
*
* @param propertyName
* プロパティ名。{@literal null}や空文字列であってはいけません
* @return {@link PropertyDesc}
*/
PropertyDesc getPropertyDesc(String propertyName);
/**
* {@link PropertyDesc}を返します。
*
* @param index
* {@link PropertyDesc}のインデックス
* @return {@link PropertyDesc}
*/
PropertyDesc getPropertyDesc(int index);
/**
* {@link PropertyDesc}の数を返します。
*
* @return {@link PropertyDesc}の数
*/
int getPropertyDescSize();
/**
* {@link PropertyDesc}の{@link Iterable}を返します。
*
* @return {@link PropertyDesc}の{@link Iterable}
*/
Iterable<PropertyDesc> getPropertyDescs();
/**
* {@link FieldDesc}を持っているかどうかを返します。
*
* @param fieldName
* フィールド名。{@literal null}や空文字列であってはいけません
* @return {@link FieldDesc}を持っているかどうか
*/
boolean hasFieldDesc(String fieldName);
/**
* {@link FieldDesc}を返します。
*
* @param fieldName
* フィールド名。{@literal null}や空文字列であってはいけません
* @return {@link FieldDesc}
*/
FieldDesc getFieldDesc(String fieldName);
/**
* {@link FieldDesc}を返します。
*
* @param index
* {@link FieldDesc}のインデックス
* @return {@link FieldDesc}
*/
FieldDesc getFieldDesc(int index);
/**
* {@link FieldDesc}の数を返します。
*
* @return {@link FieldDesc}の数
*/
int getFieldDescSize();
/**
* {@link FieldDesc}の{@link Iterable}を返します。
*
* @return {@link FieldDesc}の{@link Iterable}
*/
Iterable<FieldDesc> getFieldDescs();
/**
* 新しいインスタンスを作成します。
*
* @param <T>
* Beanクラスの型
* @param args
* コンストラクタに渡す引数の並び
* @return 新しいインスタンス
*/
<T> T newInstance(Object... args);
/**
* 引数の型に応じた{@link ConstructorDesc}を返します。
*
* @param paramTypes
* コンストラクタに渡す引数型の並び
* @return 引数の型に応じた{@link ConstructorDesc}
*/
ConstructorDesc getConstructorDesc(Class<?>... paramTypes);
/**
* 引数に適合する{@link ConstructorDesc}を返します。
*
* @param args
* コンストラクタに渡す引数の並び
* @return 引数に適合する{@link Constructor}
*/
ConstructorDesc getSuitableConstructorDesc(Object... args);
/**
* {@link ConstructorDesc}を返します。
*
* @param index
* {@link ConstructorDesc}のインデックス
* @return {@link ConstructorDesc}
*/
ConstructorDesc getConstructorDesc(int index);
/**
* {@link ConstructorDesc}の数を返します。
*
* @return {@link ConstructorDesc}の数
*/
int getConstructorDescSize();
/**
* {@link ConstructorDesc}の{@link Iterable}を返します。
*
* @return {@link ConstructorDesc}の{@link Iterable}
*/
Iterable<ConstructorDesc> getConstructorDescs();
/**
* 引数の型に応じた{@link MethodDesc}を返します。
*
* @param methodName
* メソッド名。{@literal null}や空文字列であってはいけません
* @param paramTypes
* メソッドの引数型の並び
* @return 引数の型に応じた{@link MethodDesc} メソッド
*/
MethodDesc getMethodDesc(String methodName, Class<?>... paramTypes);
/**
* 引数の型に応じた{@link MethodDesc}を返します。見つからない場合は、{@literal null}を返します。
*
* @param methodName
* メソッド名。{@literal null}や空文字列であってはいけません
* @param paramTypes
* メソッドの引数型の並び
* @return 引数の型に応じた{@link MethodDesc}
*/
MethodDesc getMethodDescNoException(String methodName,
Class<?>... paramTypes);
/**
* 引数に適合する{@link MethodDesc}を返します。
*
* @param methodName
* メソッド名。{@literal null}や空文字列であってはいけません
* @param args
* メソッドの引数の並び
* @return 引数に適合する{@link MethodDesc} メソッド
*/
MethodDesc getSuitableMethodDesc(String methodName, Object... args);
/**
* {@link MethodDesc}があるかどうか返します。
*
* @param methodName
* メソッド名。{@literal null}や空文字列であってはいけません
* @return {@link MethodDesc}があるかどうか
*/
boolean hasMethodDesc(String methodName);
/**
* {@link MethodDesc}の配列を返します。
*
* @param methodName
* メソッド名。{@literal null}や空文字列であってはいけません
* @return {@link MethodDesc}の配列
*/
MethodDesc[] getMethodDescs(String methodName);
/**
* メソッド名の配列を返します。
*
* @return メソッド名の配列
*/
String[] getMethodNames();
}