java 反射

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
原文地址:https://www.cnblogs.com/GGboy-wu/p/10648813.html