反射获取全部成员变量,并获取对应的值

爱被打了一巴掌 2022-05-21 11:38 326阅读 0赞

直接代码Kotlin、java 两种

准备实体类

  1. class UserInfo(var name: String, var nickname: String) {
  2. fun loginValue (){
  3. System.err.print("name = $name nickname = $nickname")
  4. }
  5. }
  6. public class UserInfoJ {
  7. private String name;
  8. private String nickname;
  9. public UserInfoJ(String name, String nickname) {
  10. this.name = name;
  11. this.nickname = nickname;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getNickname() {
  20. return nickname;
  21. }
  22. public void setNickname(String nickname) {
  23. this.nickname = nickname;
  24. }
  25. }

创建工具类

  1. public class TestUtilJ {
  2. public void reflex(Object obj){
  3. Class<?> aClass = obj.getClass();
  4. // aClass.getFields() 获取 public 类型的成员
  5. Field[] declaredFields = aClass.getDeclaredFields(); //获取所有成员包含 private
  6. Method[] methods = aClass.getMethods();
  7. for (Method mt:
  8. methods) {
  9. String mn = mt.getName();
  10. Object dv = mt.getDefaultValue();
  11. String returnType = mt.getReturnType().getName();
  12. System.err.println("方法名称:" + mn + " 默认值:" + dv + " 返回类型:" + returnType);
  13. }
  14. for (Field field:
  15. declaredFields) {
  16. try {
  17. field.setAccessible(true);
  18. String fn = field.getName();
  19. Log.e(getClass().getSimpleName(), "属性名称:" + fn + " field.get(obj)= " + field.get(obj));
  20. } catch (IllegalAccessException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }

需要注意 aClass.fields 无法获取 kotlin 创建的成员

  1. class TestUtil {
  2. fun reflex(obj: Any) {
  3. val aClass = obj.javaClass // aClass.fields 无法获取 kotlin 创建的成员
  4. val declaredFields = aClass.declaredFields val methods = aClass.methods for (mt in methods) {
  5. val mn = mt.name val dv = mt.defaultValue val returnType = mt.returnType.name System.err.println("方法名称:$mn 默认值:$dv 返回类型:$returnType")
  6. }
  7. for (field in declaredFields) {
  8. try {
  9. field.isAccessible = true // 如果不设置不能获对应的值
  10. val fn = field.name Log.e(javaClass.simpleName, "属性名称:$fn field.get(obj)= ${
  11. field.get(obj)}")
  12. } catch (e: IllegalAccessException) {
  13. e.printStackTrace()
  14. }
  15. }
  16. }
  17. }

MainActivity 暂未提供 Java 版本,不懂得小伙伴可自己调用

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. var userInfoC = UserInfoJ("勤和", "测试")
  6. TestUtilJ().reflex(userInfoC)
  7. var userInfo = UserInfo("kotlin", "测试反射")
  8. var tUtil = TestUtil()
  9. tUtil.reflex(userInfo)
  10. }
  11. }

发表评论

表情:
评论列表 (有 0 条评论,326人围观)

还没有评论,来说两句吧...

相关阅读