直接代码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)
}
}