回答編集履歴

7

追加

2022/10/31 01:56

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -64,3 +64,7 @@
64
64
  ---
65
65
  クラスに値を設定しているツールの個所を調べるのでしたら、ツールが setFirstName を呼んで値を設定しているのであれば、 setFirstName 内にブレイクポイントを設定し、止まったらステップで進めて『どこに戻るか』で追えると思います。
66
66
  セッターが無く直接フィールドに設定しているようであれば、コンストラクタで止めてその戻り先を追う手もあると思います。
67
+ またデバッガを使わなくても(setFirstName やコンストラクタで)スタックトレースを表示させるという方法もあります。
68
+ ```java
69
+ (new Throwable()).printStackTrace();
70
+ ```

6

修正

2022/10/30 10:11

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -57,8 +57,8 @@
57
57
  > java teratail_java.q_8p0wb9a9zo3w32.Main teratail_java.q_8p0wb9a9zo3w32.TestAction firstName=ABC
58
58
  My name is ABC
59
59
  ```
60
- となります。
60
+ となります。 Main クラスには TestAction クラスに関することは全く書かれていませんが、クラス名等を文字列として渡すことで、オブジェクトの生成・メソッドの検索・実行が出来るということです。
61
- は setter を名前しか見ていませんが、アノテーションフィールド直接でも同様のことが出来ます。
61
+ こでは setter を名前しか見ていませんが、アノテーションで探したり、フィールドでも同様のことが出来ます。
62
62
  そしてこの main のように"有ったらそれで処理する"形であれば、もし TestAction に setFirstName が無かったら処理せずに次のパラメータに移ってしまいますので、結果的に「そのパラメータは破棄されます」。
63
63
 
64
64
  ---

5

追加

2022/10/30 09:18

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -60,3 +60,7 @@
60
60
  となります。
61
61
  これは setter を名前しか見ていませんが、アノテーションやフィールド直接でも同様のことが出来ます。
62
62
  そしてこの main のように"有ったらそれで処理する"形であれば、もし TestAction に setFirstName が無かったら処理せずに次のパラメータに移ってしまいますので、結果的に「そのパラメータは破棄されます」。
63
+
64
+ ---
65
+ クラスに値を設定しているツールの個所を調べるのでしたら、ツールが setFirstName を呼んで値を設定しているのであれば、 setFirstName 内にブレイクポイントを設定し、止まったらステップで進めて『どこに戻るか』で追えると思います。
66
+ セッターが無く直接フィールドに設定しているようであれば、コンストラクタで止めてその戻り先を追う手もあると思います。

4

修正

2022/10/30 05:14

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -59,4 +59,4 @@
59
59
  ```
60
60
  となります。
61
61
  これは setter を名前しか見ていませんが、アノテーションやフィールド直接でも同様のことが出来ます。
62
- そしてこの main で、もし TestAction に setFirstName が無かったら if(method != null) が成立せずに次のパラメータの処理に移ってしまいますので、結果的に「そのパラメータは破棄されます」。
62
+ そしてこの main のように"有ったらそれ処理する"形であれば、もし TestAction に setFirstName が無かったら処理せずに次のパラメータに移ってしまいますので、結果的に「そのパラメータは破棄されます」。

3

追加

2022/10/30 05:10

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -59,3 +59,4 @@
59
59
  ```
60
60
  となります。
61
61
  これは setter を名前しか見ていませんが、アノテーションやフィールド直接でも同様のことが出来ます。
62
+ そしてこの main では、もし TestAction に setFirstName が無かったら if(method != null) が成立せずに次のパラメータの処理に移ってしまいますので、結果的に「そのパラメータは破棄されます」。

2

コード追加

2022/10/29 17:10

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -1 +1,61 @@
1
1
  html (jsp がどのような html に展開され、ブラウザが form をどう送信するか)、サーブレット(送信されたデータをどう扱えるか)、リフレクション(オブジェクトのフィールドやメソッドの調査・使用)等が分かれば想像が付くと思います。
2
+
3
+ ---
4
+ リフレクションとしては
5
+ ```java
6
+ package teratail_java.q_8p0wb9a9zo3w32;
7
+
8
+ import java.lang.reflect.Constructor;
9
+ import java.lang.reflect.Method;
10
+
11
+ public class Main {
12
+ public static void main(String[] args) throws Exception {
13
+ if(args.length != 2) {
14
+ System.err.println("Usage: Main <class-name> <parameters>");
15
+ System.err.println(" parameters: name1=value1&name2=value2&...");
16
+ System.exit(1);
17
+ }
18
+
19
+ Class<?> actionClass = Class.forName(args[0]);
20
+ Constructor<?> constructor = actionClass.getConstructor();
21
+ Object instance = constructor.newInstance();
22
+
23
+ for(String arg : args[1].split("&")) {
24
+ String[] tokens = arg.split("=");
25
+ if(tokens.length == 2) {
26
+ String setterName = "set" + tokens[0].substring(0,1).toUpperCase() + tokens[0].substring(1);
27
+ Method method = actionClass.getDeclaredMethod(setterName, String.class);
28
+ if(method != null) method.invoke(instance, tokens[1]);
29
+ }
30
+ }
31
+
32
+ Method method = actionClass.getDeclaredMethod("execute");
33
+ method.invoke(instance);
34
+ }
35
+ }
36
+ ```
37
+ といったコードで、
38
+ ```java
39
+ package teratail_java.q_8p0wb9a9zo3w32;
40
+
41
+ public class TestAction {
42
+ String firstName;
43
+ public String execute() {
44
+ System.out.println("My name is " + firstName);
45
+ return "success";
46
+ }
47
+ public String getFirstName() {
48
+ return firstName;
49
+ }
50
+ public void setFirstName(String firstName) {
51
+ this.firstName = firstName;
52
+ }
53
+ }
54
+ ```
55
+ という(質問に出た)クラスを用いるように指定すると
56
+ ```plain
57
+ > java teratail_java.q_8p0wb9a9zo3w32.Main teratail_java.q_8p0wb9a9zo3w32.TestAction firstName=ABC
58
+ My name is ABC
59
+ ```
60
+ となります。
61
+ これは setter を名前しか見ていませんが、アノテーションやフィールド直接でも同様のことが出来ます。

1

追加

2022/10/29 15:44

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -1 +1 @@
1
- html 、サーブレット、リフレクション等が分かれば想像が付くと思います。
1
+ html (jsp がどのような html に展開されブラウザが form をどう送信するか)、サーブレット(送信されたデータをどう扱えるか)、リフレクション(オブジェクトのフィールドやメソッドの調査・使用)等が分かれば想像が付くと思います。