利用反射获取对象的数组(Array)属性

Posted by Jeremy Song on 2021-12-07
Estimated Reading Time 1 Minutes
Words 335 In Total
Viewed Times

有时候我们在写逻辑的时候会遇到取某一个数组的内容,下面用几行示例说明一下这种情况如何获取希望的值:

获取域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* @author jeremysong
*/
public class AccessChecker {

public static boolean check(Object obj, String tag) {
if (obj == null || tag == null || tag.isEmpty()) {
return false;
}

try {
Class clz = obj.getClass();
// Field field = clz.getField("tags");
Field field = clz.getDeclaredField("tags");
field.setAccessible(true);
String[] tags = (String[]) field.get(obj);
for (String t : tags) {
if (tag.equals(t)) return true;
}
} catch (NoSuchFieldException e) {
System.out.println("指定对象无tags属性");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("获取不到指定对象的tags属性");
e.printStackTrace();
}

return false;
}
}

测试用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Worker {

private String name;
private String[] tags;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String[] getTags() {
return tags;
}

public void setTags(String[] tags) {
this.tags = tags;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.junit.Assert;
import org.junit.Test;

public class AccessCheckerTester {

@Test
public void testCheck1() {
Worker worker = new Worker();
worker.setName("jeremysong");
worker.setTags(new String[]{"person", "male", "developer"});
Assert.assertTrue(AccessChecker.check(worker, "person"));
}

@Test
public void testCheck2() {
Worker worker = new Worker();
worker.setName("jeremysong");
worker.setTags(new String[]{"person", "male", "developer"});
Assert.assertFalse(AccessChecker.check(worker, "teacher"));
}
}

测试用例执行结果


欢迎关注我的公众号 须弥零一,跟我一起学习IT知识。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !