反射获取全部成员变量,并获取对应的值
直接代码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)
}
}
还没有评论,来说两句吧...