zoukankan      html  css  js  c++  java
  • 深入理解反射

     
    Java里,无论生成某个类的多少对象,这些对象都会对应于同一个Class对象。
    Java的反射机制允许程序在运行时透过Reflection APIs(反射api)取得任何一个已知名称的class的所有内部信息。

    1、反射有什么用

    可以这么说,其实java类的成员变量、方法是不是private没有关系,运用反射就完全可以玩转类的私有变量和私有方法。正是因为反射的这两部分使用才有了hibernatespring等框架,换言之,没有反射就没有框架!
    1运行时判断任意一个对象所属的类
    2运行时构造任意一个类的对象
    3运行时判断任意一个类所具有成员变量和方法
    4运行时调用任意一个对象的方法
    注意:全是运行时,java反射是运行时的行为。

    2、玩转反射

    (1)反射修改对象的私有成员变量

    //User对象
    public class User {
        private int id = 1;
        private String name = "大胖子";
    
        public String getName() {
            return name;
        }
    }
    
    public static void main(String[] args) throws Exception {
        Class<?> clazz = User.class;
        User user = (User) clazz.newInstance();
    
        Field idField = clazz.getDeclaredField("name");
        idField.setAccessible(true); //放开Java对访问修饰符访问控制检查
        idField.set(user, new String("小瘦子"));
    
        System.out.println(user.getName());
    }
    输出结果:小瘦子
    

    (2)反射调用对象的私有方法

    //User对象
    public class User {
        private int id;
        
        private void setId(int id) {
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    }
    
    public static void main(String[] args) throws Exception {
        Class<?> clazz = User.class;
        User user = (User)clazz.newInstance();
    
        Method setIdMethod = clazz.getDeclaredMethod("setId", new Class[]{int.class});
    
        setIdMethod.setAccessible(true); //放开Java对访问修饰符访问控制检查
        setIdMethod.invoke(user, new Object[]{1000});
    
        System.out.println(user.getId());
    
    }
    输出结果:1000
    

    3、补充

    (1)int.class和Integer.class不是一回事。
    (2)反射的其他方法如getDeclaredFields(),查询API
     
  • 相关阅读:
    分类汇总统计mysql数据库一个字段中不同的记录的总和
    golang 基础知识4
    golang 基础知识3
    golang 基础知识2
    golang 基础知识1
    mysql 锁
    node child_process
    go get下载被墙的包
    mac 修改root的密码
    ali
  • 原文地址:https://www.cnblogs.com/onezg/p/9350168.html
Copyright © 2011-2022 走看看