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

直接代码Kotlin、java 两种 

准备实体类

class UserInfo(var name: String, var nickname: String) {
  fun loginValue (){
    System.err.print("name = $name nickname = $nickname")
  }
}
public class UserInfoJ {
  private String name;
  private String nickname;

  public UserInfoJ(String name, String nickname) {
    this.name = name;
    this.nickname = nickname;
  }

  public String getName() {
    return name;
  }

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

  public String getNickname() {
    return nickname;
  }

  public void setNickname(String nickname) {
    this.nickname = nickname;
  }
}

创建工具类

public class TestUtilJ {
  public void reflex(Object obj){
    Class<?> aClass = obj.getClass();
    // aClass.getFields() 获取 public 类型的成员
    Field[] declaredFields = aClass.getDeclaredFields(); //获取所有成员包含 private
    Method[] methods = aClass.getMethods();
    for (Method mt:
    methods) {
      String mn = mt.getName();
      Object dv = mt.getDefaultValue();
      String returnType = mt.getReturnType().getName();
      System.err.println("方法名称:" + mn + "    默认值:" + dv + "    返回类型:" + returnType);
    }
    for (Field field:
    declaredFields) {
      try {
        field.setAccessible(true);
        String fn = field.getName();
        Log.e(getClass().getSimpleName(), "属性名称:" + fn + "   field.get(obj)= " + field.get(obj));
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
  }
}

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

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

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

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    var userInfoC = UserInfoJ("勤和", "测试")
    TestUtilJ().reflex(userInfoC)
    var userInfo = UserInfo("kotlin", "测试反射")
    var tUtil = TestUtil()
    tUtil.reflex(userInfo)
  }
}

猜你喜欢

转载自blog.csdn.net/ff_hh/article/details/80940535