html (jsp がどのような html に展開され、ブラウザが form をどう送信するか)、サーブレット(送信されたデータをどう扱えるか)、リフレクション(オブジェクトのフィールドやメソッドの調査・使用)等が分かれば想像が付くと思います。
リフレクションとしては
java
1package teratail_java.q_8p0wb9a9zo3w32;
2
3import java.lang.reflect.Constructor;
4import java.lang.reflect.Method;
5
6public class Main {
7 public static void main(String[] args) throws Exception {
8 if(args.length != 2) {
9 System.err.println("Usage: Main <class-name> <parameters>");
10 System.err.println(" parameters: name1=value1&name2=value2&...");
11 System.exit(1);
12 }
13
14 Class<?> actionClass = Class.forName(args[0]);
15 Constructor<?> constructor = actionClass.getConstructor();
16 Object instance = constructor.newInstance();
17
18 for(String arg : args[1].split("&")) {
19 String[] tokens = arg.split("=");
20 if(tokens.length == 2) {
21 String setterName = "set" + tokens[0].substring(0,1).toUpperCase() + tokens[0].substring(1);
22 Method method = actionClass.getDeclaredMethod(setterName, String.class);
23 if(method != null) method.invoke(instance, tokens[1]);
24 }
25 }
26
27 Method method = actionClass.getDeclaredMethod("execute");
28 method.invoke(instance);
29 }
30}
といったコードで、
java
1package teratail_java.q_8p0wb9a9zo3w32;
2
3public class TestAction {
4 String firstName;
5 public String execute() {
6 System.out.println("My name is " + firstName);
7 return "success";
8 }
9 public String getFirstName() {
10 return firstName;
11 }
12 public void setFirstName(String firstName) {
13 this.firstName = firstName;
14 }
15}
という(質問に出た)クラスを用いるように指定すると
plain
1> java teratail_java.q_8p0wb9a9zo3w32.Main teratail_java.q_8p0wb9a9zo3w32.TestAction firstName=ABC
2My name is ABC
となります。 Main クラスには TestAction クラスに関することは全く書かれていませんが、クラス名等を文字列として渡すことで、オブジェクトの生成・メソッドの検索・実行が出来るということです。
ここでは setter を名前しか見ていませんが、アノテーションで探したり、フィールドでも同様のことが出来ます。
そしてこの main のように"有ったらそれで処理する"形であれば、もし TestAction に setFirstName が無かったら処理せずに次のパラメータに移ってしまいますので、結果的に「そのパラメータは破棄されます」。
クラスに値を設定しているツールの個所を調べるのでしたら、ツールが setFirstName を呼んで値を設定しているのであれば、 setFirstName 内にブレイクポイントを設定し、止まったらステップで進めて『どこに戻るか』で追えると思います。
セッターが無く直接フィールドに設定しているようであれば、コンストラクタで止めてその戻り先を追う手もあると思います。
またデバッガを使わなくても(setFirstName やコンストラクタで)スタックトレースを表示させるという方法もあります。
java
1(new Throwable()).printStackTrace();
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。