質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

解決済

4回答

4953閲覧

String配列から値をひとつずつ取得して、ModelClassのSetterに詰め替えたい

ecaepazo

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

0グッド

0クリップ

投稿2015/12/18 01:25

###前提・実現したいこと
String配列から値をひとつずつ取得して、ModelClassのSetterに詰め替えたいのですが、
処理が単調で長くなるので短くしたいです。(100項目ほどあります。)

for文などで考えてみたのですがうまくいきません。

ご教示いただけると幸いです。
よろしくお願い致します。

###ソースコード

Java

1model.setItem001(cols[0]); 2model.setItem002(cols[1]); 3model.setItem003(cols[2]); 4model.setItem004(cols[3]); 5model.setItem005(cols[4]); 6model.setItem006(cols[5]); 7model.setItem007(cols[6]); 8model.setItem008(cols[7]); 9model.setItem009(cols[8]); 10model.setItem010(cols[9]); 11model.setItem011(cols[10]);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ModelClassに入れる要素をStringではなくString配列に変更できませんか?

投稿2015/12/18 01:35

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ecaepazo

2015/12/18 02:11 編集

仕様上、この段階ではStringで入ってきています。 その文字列を指定桁数で区切りながら、String[]に詰めている形になります。 それをmodelのsetterに詰め替えたいです。
guest

0

リフレクションつかって解決したようですが、struts 使っているならば、
BeanUtils.setProperty() をつかうべきです。
自前でリフレクションを実装する必要はありません。

投稿2015/12/20 04:39

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ecaepazo

2015/12/21 10:00

ありがとうございます。 BeanUtilsで同様の動作を実装できました。 機能でまだまだ知らないことがあるので、ドキュメントをもっと活用したいと思います。 ありがとうございました。
guest

0

ベストアンサー

Setterメソッドのループ、可能です。
それにはリフレクションという手法を用います。

Class<?> modelClass = model.getClass();

これでmodelインスタンスの型情報が取れますので、

Method[] modelMethods = modelClass.getMethods();

としてメソッド情報を配列で取ります。
Methodオブジェクトはメソッドの名前から引数構成からなんでも持っていて、もちろんinvokeメソッドで実行できますので、ご希望の処理が書けるはずです。

投稿2015/12/18 03:57

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/12/18 04:01

あ、modelのクラス名はModelClassだとわかっているんだから、ModelClass.class.getMethods() でメソッド情報配列とれます。
ecaepazo

2015/12/18 15:40

ありがとうございます リフレクション素晴らしいですね! 見事に短縮しました。 ご教授頂きありがとうございました。
yuba

2015/12/20 03:44

> リフレクション素晴らしいですね! ここまで紹介しておいてなんですが、リフレクションは全然素晴らしくないです。むしろ邪道、特にアプリケーションプログラミングにおいては禁忌と言うべき技法です。Javaは実行時型情報(つまりリフレクションやinstanceof演算子)なしで十分にアプリケーションを記述できる強力なオブジェクト指向言語であり、これらが必要になっている時点で根本的に設計が間違っていると断言できるものです。 設計が破綻しているのは質問文を一瞥しただけで明らかなのですが、swordoneさんとの問答を見る限り、それを見直すのはOzaPeaceさんの手の及ぶ範囲ではないのでしょう。 ですからまず大事な認識として、本来やるべきことは無能な設計者をサボタージュ容疑で逮捕してシベリアで思想再教育を行うことです同志。それができない場合、どうおかしな設計と戦うかですが・・・ ●リフレクションを使うにあたって注意すべきこと ・コンパイルエラーがランタイムエラーになります メソッド名を書き連ねていた場合、ミスタイプなどによる間違いはまずコンパイルエラーとなるのでバイナリにまでたどりつきません。リフレクションの場合コンパイラには間違いが検出できないため、実行時に本番環境で火を噴きます。 ・IDEの改名機能がおよばなくなります IDEの改名機能で将来メソッド名を変更しても、リフレクションコードまでは変わりません。改名に無事成功したように見えて、やはり本番環境で初めて異常に気付くということになり得ます。 ・コードの可読性は確実に落ちます 結局、メソッド名を書き連ねていたコードをコメントアウトで残して「以下と同等の処理」とでも注釈する必要があるかも。 ・パフォーマンスは落ちます とは言え、この設計者ではもともとまともなパフォーマンスを出せているとは思えませんのでここはスルー。
ecaepazo

2015/12/21 10:09

ご指摘ありがとうございます。 リフレクションも含めJAVAの機能についてや使うことの影響度についてまだまだ勉強不足であると痛感しています。 リフレクションを調べた際にセキュリティに関しての記事がいくつかあったので、もっと注意深く考えて実装するべきだと感じております。 今回の実装も含めて、さらに勉強していきたいと思います。 仕様面で値が渡ってきているのでどうしようもないこともありますが。。
guest

0

Modelに項目分のSetterが存在してるならそのSetterの分だけ記述するしかないような気がします。

以下のサイトを参考にすればSetterの数だけループさせて処理することもできそうですが…。
Javaでprivateなfieldやmethodにアクセスする

投稿2015/12/18 01:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ecaepazo

2015/12/18 02:12

やはり、Setterメソッド名をループさせるようなことは難しいのでしょうか。 参考サイトを教えていただきありがとうございます。 早速拝見してみます。
退会済みユーザー

退会済みユーザー

2015/12/18 02:23

普通のやり方ではできないと思います。 参考サイトの内容はprivateのフィールドやメソッドにアクセスする方法ですが、読み替えればフィールド名やメソッド名の文字列から対象のフィールドやメソッドにアクセスできることになります。 メソッド名を保持した配列と設定したい値の配列で整合性が取れていればループでの処理も可能になるかと。 あまりお力になれずに申し訳ないです…。
ecaepazo

2015/12/18 15:37

ありがとうございます リフレクションという方法でなんとかいけました! サイトも教えて頂き助かりました
退会済みユーザー

退会済みユーザー

2015/12/19 08:38

無事にできたみたいでよかったです。 ただリフレクションは便利な半面、クラス設計を破壊する仕組みなので個人的にはおすすめしないやり方です。 (普通のやり方ではできないと言ったのはこのため) リンクを貼らせていただいた参考サイトもリフレクションしています。 フレームワークの開発ならリフレクションを多用することはあると思いますが 企業で使用するような業務システムの開発等では極力使用しないことをおすすめします。
ecaepazo

2015/12/21 10:10

> 企業で使用するような業務システムの開発等では極力使用しないことをおすすめします。 ご指摘ありがとうございます。 他の方にもご指摘いただいたように、もう少し考えようと思います。 単調に入力するべき箇所もあるのかなと思っているところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問