リフレクション2
前回はリフレクションを利用してオブジェクトを作成しましたが、今回は、メンバー変数名やメソッド名を取得してみます。メンバー変数名、メソッド名を取得
メンバー変数名を取得するには、getDeclaredFields(getFields)メソッド、メソッド名を取得するにはgetDeclaredMethods(getMethods)メソッドを使用します。
Declaredを付けると自分で定義したもの、付けないと親クラスを含めてpublicのものを取得します。
Test.java
package javaTest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
private int privateInt;
int packageInt;
protected int protectedInt;
public int publicInt;
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName(Test.class.getName());
System.out.println("Class:" + clazz.getName());
System.out.println("----------");
System.out.println("Fields:");
for (Field field : clazz.getDeclaredFields()) {
System.out.println(field.getName() + ":" + field.getType() + ":" + field.getModifiers());
}
System.out.println("----------");
System.out.println("Methods:");
for (Method method : clazz.getDeclaredMethods()) {
System.out.println(method.getName() + "+" + method.getReturnType() + "+" + method.getModifiers());
for (Class<?> param : method.getParameterTypes()) {
System.out.println("-" + param.getName());
}
}
}
public int getPublic(int arg, String arg2) {
return 0;
}
protected String getProtected() {
return "";
}
void voidPackage() {
}
private String getPrivate() {
return "";
}
}
実行結果(Declaredあり)
getDeclaredFields、getDeclaredMethodsを
Class:javaTest.Test
----------
Fields:
privateInt:int:2
packageInt:int:0
protectedInt:int:4
publicInt:int:1
----------
Methods:
main+void+9
-[Ljava.lang.String;
getProtected+class java.lang.String+4
getPrivate+class java.lang.String+2
voidPackage+void+0
getPublic+int+1
-int
-java.lang.String
実行結果(Declaredなし)
getFields、getMethodsを使用
Class:javaTest.Test
----------
Fields:
publicInt:int:1
----------
Methods:
main+void+9
-[Ljava.lang.String;
getPublic+int+1
-int
-java.lang.String
wait+void+17
-long
-int
wait+void+17
wait+void+273
-long
equals+boolean+1
-java.lang.Object
toString+class java.lang.String+1
hashCode+int+257
getClass+class java.lang.Class+273
notify+void+273
notifyAll+void+273
setterに値をセットするソースを作成するサンプル
package javaTest;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName(Test.class.getName());
String className = clazz.getSimpleName();
String name = getName(className);
System.out.println(className + " " + name + " = new " + className + "();");
for (Method method : clazz.getDeclaredMethods()) {
if (method.getModifiers() == 2) {
continue;
}
if (!method.getName().startsWith("set")) {
continue;
}
System.out.println(name + "." + method.getName() + "("
+ getParam(method.getName().substring(3), method.getParameterTypes()) + ");");
}
}
private static String getParam(String method, Class<?>[] parameterTypes) {
StringBuilder ret = new StringBuilder();
for (Class<?> param : parameterTypes) {
if (ret.length() > 0) {
ret.append(", ");
}
switch (param.getSimpleName()) {
case "String":
ret.append("\"" + method + "\"");
break;
case "int":
case "long":
ret.append(method.length());
break;
}
}
return ret.toString();
}
private static String getName(String className) {
return className.substring(0, 1).toLowerCase() + className.substring(1);
}
public void setPublic(String arg) {
}
public void setProtected(int arg) {
}
public void setPrivate(long arg) {
}
}
実行結果
Test test = new Test();
test.setProtected(9);
test.setPrivate(7);
test.setPublic("Public");
getterでtoStringを作成するソースを作成するサンプル
package javaTest;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName(Test.class.getName());
System.out.println("@Override");
System.out.println("public String toString() {");
System.out.println("StringBuilder stb = new StringBuilder();");
for (Method method : clazz.getDeclaredMethods()) {
if (!method.getName().startsWith("get")) {
continue;
}
if (method.getModifiers() > 4) {
continue;
}
System.out.println(
"stb.append(\"" + getName(method.getName().substring(3)) + ":\" + " + method.getName() + "());");
System.out.println("stb.append(System.lineSeparator());");
}
System.out.println("return stb.toString();");
System.out.println("}");
}
private static String getName(String name) {
return name.substring(0, 1).toLowerCase() + name.substring(1);
}
public String getA() {
return "";
}
private int getB() {
return 0;
}
}
@Override
public String toString() {
StringBuilder stb = new StringBuilder();
stb.append("a:" + getA());
stb.append(System.lineSeparator());
stb.append("b:" + getB());
stb.append(System.lineSeparator());
return stb.toString();
}
ページのトップへ戻る