java - 关于泛型和反射的代码错误(cannot select from a type variable)
迷茫
迷茫 2017-04-18 10:51:04
0
3
1100

问题1:
想写个requestInfo的toString方法,把所有的成员变量都打印出来,子类就不用每次都写个toString方法了,但是父类怎么获取子类成员变量的值?

public class RequestInfo
{
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        Field[] fields = this.getClass().getDeclaredFields();
        for(Field field : fields)
        {
            sb.append(field.getName(), " = ", (这里怎么获取属性值?), ";");
        }
        return "";
    }
}

问题2
下面那个类P怎么实例化,也没懂错误的原因,用P.getClass()还是不行

public abstract class AbstractService<Q extends RequestInfo, P extends ResponseInfo>
{
    public static final Logger LOGGER = LoggerFactory.getLogger(AbstractService.class);

    private String logTag;

    private P respBean;

    public P execute(Q reqBean)
    {
        init();
        LOGGER.info(StringUtil.appendStr("Request : {}, req = {}", logTag, reqBean.toString()));

        try
        {
            if (checkInput(reqBean))
            {
                handle(reqBean, respBean);
            }
            else
            {
                throw new Exception(StringUtil.appendStr(logTag, " check input param invalid"));
            }
        }
        catch (Exception e)
        {
            LOGGER.error(StringUtil.appendStr(logTag, " Exception: "), e);
        }
        return respBean;
    }

    protected void init()
    {
        logTag = getClass().getSimpleName();
        respBean =P.class.newInsance();//这里报错,cannot select from a type variable
    }

    protected boolean checkInput(Q reqBean)
    {
        return true;
    }

    protected abstract void handle(Q reqBean, P respBean)
            throws Exception;
}
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全員に返信(3)
PHPzhong

ジェネリックはコンパイル後に消去されました。jvm はジェネリック情報をまったく参照できません。これは歴史的な理由によるものであり、あなたが言及した p.getClass は存在できません。

最初の質問ですが、このアイデアは非常に良いですが、私の知る限り、オブジェクトはサブクラスのステータスを知ることができず、親クラスまたは親インターフェースからのみメソッドをクエリできます。 サブクラスのメンバー変数を取得できると考えている最初の疑問は、サブクラスの toString メソッドが継承後に実行されると、独自の this も呼び出されるということですが、これは間違いです。実行時に、jvm は親クラスのオブジェクト空間からこのメソッドを取得して実行します。したがって、何があっても、それらは親クラスの単なるメンバー変数です

上記の斜体の部分で間違いがありました。IDE を実行してテストしたところ、質問者様にご迷惑をおかけしなければ幸いです。 以下に投稿されたコードは、サブクラスから親クラスまでのすべての変数を取得するためにループできます。お役に立てば幸いです

リーリー
いいねを押す +0
刘奇

リフレクションツールクラス

リーリー

質問1

リーリー

質問2

リーリー
いいねを押す +0
刘奇

最初の質問は、commons-beanutils を使用して解決できます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!