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

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

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

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

解決済

【JAVA】リストのクラス型を取得する方法を知りたい。

shiomi
shiomi

総合スコア1

Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1回答

0グッド

0クリップ

256閲覧

投稿2022/12/07 14:46

前提

springフレームワークを使用。

実現したいこと

Entityクラスからリストのクラス型を取得したい

該当のソースコード

TestEntity.java

1@Entity 2@Data 3public class TestEntity{ 4 5private List〈Hoge〉hogeList; 6

Hoge.java

1@Entity 2@Data 3public class Hoge{ 4 5private String dog; 6 7private int num; 8

TestClass.java

1 2public class TestClass{ 3 4// TestEntityのhogeListからhogeのインスタンスを取得したい 5

試したこと

TestClass.java

1 2public class TestClass{ 3 4 public void sample(){ 5 TestEntity entity = new TestEntity(); 6 Field field = entity.getClass().getDeclaredFields(); 7System.out.println(field.getType()); 8 } 9

Fieldクラスから取得しようと試みた

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2022/12/07 18:38

List のクラスは List.class では。
shiomi

2022/12/07 22:41

そうなんです。 ただ私はHogeを取得したいのです。
xebme

2022/12/08 00:47

型がわかるのはコンパイラまでで、実行時のListの要素の型クラスは、型イレージャによってObjectになっています。 Hoge型であることがわかるのは、Listから要素を取り出したときです。
xebme

2022/12/08 01:46 編集

実行時にListが空ならジェネリックな型は不明ということになります。
jimbe

2022/12/08 04:55 編集

List<Hoge> の Hoge は型パラメータ(入れられるオブジェクトのクラス)であって『リストのクラス型』というのでは無いのでは…。 『TestEntityのhogeListからhogeのインスタンスを取得したい』のなら、TestEntity にゲッターでも作って取り出せるようにするのが正攻法だと思いますが、そう出来ないのでしょうか。 >List〈Hoge〉 わざわざ <> を置換しなくても、コードのマークダウンの中なら大丈夫です。反ってコピペでエラーになるのでやらない方が良いです。
xebme

2022/12/08 22:15

すみません。こちらで試したところ取得できました。回答へのコメントをご覧ください。

回答1

0

自己解決

前提としてTestEntityとHogeののパッケージを以下とします。
import test.sample.entity.TestEntityi;
import test.sample.entity.Hoge;

TestClass.java

1 2public void sample(){ 3TestEntity entity= new TestEntity (); 4 Method[]methods = entity.getClass().getMethods(); 5 for (Method m: methods) { 6 if (m.getDeclaringClass() == Object.class) continue; 7 Type type = m.getGenericReturnType(); 8  // type → java.util.List<test.sample.entity.Hoge> 9 String typeStr = type.toString().split("<")[0]; 10 if("java.util.List".equals(typeStr){ 11 String hogeName = type.toString().split("<")[1].replace(">",""); 12    // hogeName → test.sample.entity.Hoge 13 Object object = Class.forName("hogeName").newInstance(); 14 } 15 } 16}

インデントひどくてすみません。
無理やり文字列からインスタンスを生成し、なんとかなりました。

投稿2022/12/08 12:55

shiomi

総合スコア1

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

shiomi

2022/12/08 13:06

訂正 "hogeName" → hogeName
xebme

2022/12/08 20:58 編集

認識を新たにしました。こちらでもやってみます。 getter/setterが自動生成されるのでメソッドの戻り値から型が取れた。当たり前ですね。
xebme

2022/12/08 22:37 編集

TestEntityのhogeListですが、javapでクラスの中を見ると型パラメータの値が入っています。 private java.util.List<qpmif5xecid1lkh.Hoge> hogeList; descriptor: Ljava/util/List; flags: (0x0002) ACC_PRIVATE Signature: #8 // Ljava/util/List<Lqpmif5xecid1lkh/Hoge;>; qpmif5xecid1lkh はこちらで作成したパッケージ名です。 qpmif5xecid1lkh/Hoge はクラス名です。 このようにすると取得できます。 Field f = qpmif5xecid1lkh.TestEntity.class.getDeclaredField("hogeList"); Type t = f.getGenericType(); System.out.println(t.getTypeName()); private フィールドの場合、getDeclaredField() メソッドで情報を取得

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。