java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
java 反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运动时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。
关于获取类的字段有两种方式:getFields()和getDeclaredFields();两者有区别:
getFields():获取某个类的所有公共(public)的字段,包括父类中的字段;
getDeclaredFields():获取某个类的所有声明字段,包括public、private和protected,但是不包括父类的申明字段。
同样类似的还有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclredMethods(),这分别是获取某个类的方法、构造函数的。
具体编码:
先创建一个POJO
1 public class User { 2 private long id; 3 private String name; 4 5 public void setId(long id) { 6 this.id = id; 7 } 8 9 public void setName(String name) { 10 this.name = name; 11 } 12 13 public long getId() { 14 return id; 15 } 16 17 public String getName() { 18 return name; 19 } 20 }
通过 Field[] fields = User.class.getDeclaredFields(); 获取这个类的所有字段
可以通过for循环:for(Field field:fields){}, 来获取想要的内容
例如:
获取字段的名称: String fieldName = field.getName();
获取字段的修饰符: int fieldValue = field.getModifiers();//如:private/static/final等等
与某个具体的修饰符进行比较: Modifier.isStatic(fieldValue)//看修饰符是否是静态,即static
获取字段的声明类型: field.getType();//返回的是个clss
与某个类型进行比较: field.getType() == Timestamp.class
获取指定对象中字段的值: Object fieldObject = field.get(User);//user可以看作是从数据库查找出来的对象
如果POJO类中存在一个集合类型的字段,首先创建一个POJO类
1 public class Bean { 2 3 private String[] love; 4 5 public String[] getLove() { 6 return love; 7 } 8 9 public void setLove(String[] love) { 10 this.love = love; 11 } 12 }
创建一个操作类
import java.lang.reflect.Method; public class Admin { public static void main(String[] args) { try { // 赋值 Object obj = Bean.class.newInstance(); Class paramClass = Class.forName("[Ljava.lang.String;"); String[] param = { "吃", "喝", "玩", "乐" }; Method method = Bean.class.getMethod("setLove", paramClass); method.invoke(obj, (Object) param); // 取值 Bean bean = (Bean) obj; for (int i = 0; i < bean.getLove().length; i++) { System.out.println(bean.getLove()[i]); } System.out.println(); } catch (Exception e) { e.printStackTrace(); } } }
得到结果是:
吃
喝
玩
乐
关于field,还有一种情况需要注意,就是当字段的修饰符是private时,需要加上:
field.setAccessible(true);
判断方法是:if(!field.isAccessible()){}
出自:https://www.cnblogs.com/JackZed/p/6888668.html#commentform