本人面临的问题是希望通过单独的一个对象,获取到对象中的属性和属性值,在实际操作中,发现具体用到的主要方法大概有以下几个:
1、invoke方法,
反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作,invoke(Object obj,Object… args),obj - 从中调用底层方法的对象(简单的说就是调用谁的方法用谁的对象)args - 用于方法调用的参数
2、getMethod方法
Method Class.getMethod(String name, Class<?>… parameterTypes)的作用是获得对象所声明的公开方法,该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。
3、getDeclaredFields方法
获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
4、getGenericType方法
返回属性声的Type类型,getGenericType()如果当前属性有签名属性类型就返回,否则就返回 Field.getType()
话不多说,附上我测试的代码,里面用到了这些方法,以及如何通过对象取值和赋值,希望对大家有所帮助,跳过碰到的所有坑。
实体类:
package com.wjd.demo;
public class Cat {
private String kk;
private String bb;
private String aa;
private String cc;
public Cat(String kk, String bb, String aa, String cc) {
this.kk = kk;
this.bb = bb;
this.aa = aa;
this.cc = cc;
}
public Cat() {
}
public Cat(String kk, String bb) {
this.kk = kk;
this.bb = bb;
}
public String getKk() {
return kk;
}
public String getAa() {
return aa;
}
public void setAa(String aa) {
this.aa = aa;
}
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public void setKk(String kk) {
this.kk = kk;
}
public String getBb() {
return bb;
}
public void setBb(String bb) {
this.bb = bb;
}
}
测试类
package com.wjd;
import com.wjd.demo.Cat;
import java.lang.reflect.*;
public class TestGetType {
public static void main(String[] args) {
Cat cat = new Cat();
cat.setBb("0000");
cat.setKk("1111");
Field[] fields = cat.getClass().getDeclaredFields();
for (int i=0;i<fields.length;i++) {
String name = fields[i].getName();
name = name.substring(0,1).toUpperCase().concat(name.substring(1));
String type = fields[i].getGenericType().toString();
String invoke = "";
if ("class java.lang.String".equals(type)) {
try {
Method method = cat.getClass().getMethod("get" + name);
invoke = (String) method.invoke(cat);
System.out.println(invoke);
if (invoke == null) {
Method method2 = cat.getClass().getMethod("set" + name,String.class);
method2.invoke(cat,"Shit");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
for (int i=0;i<fields.length;i++) {
String name = fields[i].getName();
name=name.substring(0,1).toUpperCase().concat(name.substring(1));
String type = fields[i].getGenericType().toString();
if ("class java.lang.String".equals(type)) {
try {
Method method = cat.getClass().getMethod("get" + name);
String invoke = (String) method.invoke(cat);
System.out.println("invoke"+(i+1)+":"+name+":"+invoke);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
结果