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

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

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

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

Spring Boot

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

Q&A

解決済

1回答

1351閲覧

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

shiomi

総合スコア7

Java

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

Spring Boot

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

0グッド

0クリップ

投稿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クラスから取得しようと試みた

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

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

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

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

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

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

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

回答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

総合スコア7

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

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

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() メソッドで情報を取得
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問