• 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
  • 相关阅读:
    appcan双击返回退出系统
    实现两个矩阵相乘的C语言程序
    编写简单的windows桌面计算器程序
    使用C++实现图形的旋转、缩放、平移
    使用MFC创建C++程序
    SQL server2017的操作(练习题)
    使用SQL语句在SQL server2017上创建数据库
    使用交互式方式在SQL server2017上创建数据库
    解决VS2017编译后的EXE文件不能在其他电脑上运行的问题
    傅里叶分析之掐死教程(完整版)更新于2014.06.06----转载
  • 原文地址:https://www.cnblogs.com/GGboy-wu/p/10648813.html
Copyright © 2020-2023  润新知