トッカンソフトウェア

リフレクション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();
}


			



ページのトップへ戻る