Java:使用反射填充 class 中的所有设置器
Java: Using reflection to fill all the setters from a class
我有一个 class X,里面可能有 100 个字符串,我想为所有以“setTop”开头的设置器做一个模拟这个 class 对象的函数。
目前我是这样做的:
public void setFtoMethods(Class aClass){
Methods[] methods = aClass.getMethods();
for(Method method : methods){
if(method.getName().startsWith("setTop")){
method.invoke ....
}
}
}
而且我现在不知道该怎么做,我不确定我是否可以像那样填充所有这些设置器。在我的环境中,我不能使用框架,我在 Java 6.
您不能 填充设置器,因为它们是方法(功能),而不是值本身。但是...
你可以填写class对应的属性(字段)的值getter.
假设你有一个 class:
class Example {
String name;
int topOne;
int topTwo;
int popTwo; // POP!!!
int topThree;
}
参加:
- this answer as model
- 您的需求(
getTopXXX
将对应字段topXXX
)
您可以通过这种方式获取仅需要的字段:
public static void main(String[] args) {
inspect(Example.class);
}
public static <T> void inspect(Class<T> klazz) {
Field[] fields = klazz.getDeclaredFields();
for (Field field : fields) {
if (field.getName().startsWith("top")) {
// get ONLY fields starting with top
System.out.printf("%s %s %s%n",
Modifier.toString(field.getModifiers()),
field.getType().getSimpleName(),
field.getName()
);
}
}
}
输出:
int topOne
int topTwo
int topThree
现在,在 if (field.getName().startsWith("top")) {
而不是 System.out
中做任何你想做的事。
我有一个 class X,里面可能有 100 个字符串,我想为所有以“setTop”开头的设置器做一个模拟这个 class 对象的函数。
目前我是这样做的:
public void setFtoMethods(Class aClass){
Methods[] methods = aClass.getMethods();
for(Method method : methods){
if(method.getName().startsWith("setTop")){
method.invoke ....
}
}
}
而且我现在不知道该怎么做,我不确定我是否可以像那样填充所有这些设置器。在我的环境中,我不能使用框架,我在 Java 6.
您不能 填充设置器,因为它们是方法(功能),而不是值本身。但是...
你可以填写class对应的属性(字段)的值getter.
假设你有一个 class:
class Example {
String name;
int topOne;
int topTwo;
int popTwo; // POP!!!
int topThree;
}
参加:
- this answer as model
- 您的需求(
getTopXXX
将对应字段topXXX
)
您可以通过这种方式获取仅需要的字段:
public static void main(String[] args) {
inspect(Example.class);
}
public static <T> void inspect(Class<T> klazz) {
Field[] fields = klazz.getDeclaredFields();
for (Field field : fields) {
if (field.getName().startsWith("top")) {
// get ONLY fields starting with top
System.out.printf("%s %s %s%n",
Modifier.toString(field.getModifiers()),
field.getType().getSimpleName(),
field.getName()
);
}
}
}
输出:
int topOne
int topTwo
int topThree
现在,在 if (field.getName().startsWith("top")) {
而不是 System.out
中做任何你想做的事。