当前位置: 首页 > news >正文

反射机制概述和代码举例

1.反射的概述


    1.被视为动态语言的关键,反射机制允许程序在运行期间,借助于反射相关的api取得任何

        类内部信息,直接操作任何的属性和方法


     2.不使用反射需要考虑封装性,出了类之后不能调用私有属性 使用之后打破封装性


    场景:


        1.从程序员开发者的角度讲,开发中主要完成业务代码,对对象方法的味道都是确定的,

        使用很多
        2.主要体现了动态性,运行时动态获取对象所属的类,动态的调用方法,

        所以在设计框架的时候会大量使用反射


        3.单例模式饿汉和懒汉中私有化构造器,单例模式也可以调用(暴力反射)

       注意:


       1. 他和封装性并不冲突没有冲突和bug封装性体现的是,是否建议调用内部api的问题,

        private意味着不建议调用


       2/ 反射体现的是我们能否调用的问题,因为我们类的完整结构都加载到了内存中,

        所以我们有能力调用

代码:

先写一个有public修饰和private修饰的people类

public class People {
    public String name;
    private int age;

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public People() {
    }
    private People(int age) {
        System.out.println("People constructor");
    }
    public void show(){
        System.out.println("Name: " + name);
    }
    private void sayHello(){
        System.out.println("Hello, " + name);
    }
}

下面是用反射实现的获取方法属性和构造方法

public void test()throws Exception{
//使用反射
    Class clazz = People.class;
    People person = (People) clazz.newInstance();
    System.out.println(person);
    //调用属性
    Field name = clazz.getField("name");
    name.set(person,"hh");
    System.out.println(name.get(person));
    //调用方法
    Method showMethod = clazz.getMethod("show");
    showMethod.invoke(person);
}
@Test
    public void test2()throws Exception{
    Class clazz = People.class;
    Constructor declaredConstructor = clazz.getDeclaredConstructor(int.class);
    declaredConstructor.setAccessible(true);
    People person = (People) declaredConstructor.newInstance(13);
    //2调用私有属性
    Field declaredField = clazz.getDeclaredField("age");
    declaredField.setAccessible(true);
    declaredField.set(person,11);
    //3.调用私有方法
    Method declaredMethod = clazz.getDeclaredMethod("sayHello");
    declaredMethod.setAccessible(true);
    declaredMethod.invoke(person);
}

}

相关文章:

  • 数据库索引相关的面试题以及答案
  • python裁剪nc文件数据
  • Codeforces Round 1011 (Div. 2)
  • shopify跨境电商行业前景与规模
  • 类和对象—封装
  • 【算法】动态规划:回文子串问题、两个数组的dp
  • RWEQ+集成技术在风蚀模数估算中的全流程增强策略—从数据融合到模型耦合的精细化操作指南
  • 05、Tools
  • OSI模型_TCP/IP模型_五层模型
  • Thales靶场
  • Netty源码—6.ByteBuf原理二
  • AI Agent开发大全第十一课-超维空间里的语义翻译官:Embedding技术
  • 个人学习编程(3-25) leetcode刷题
  • Linux 练习二 LVS的NAT模式
  • 从C语言开始的C++编程生活(2)
  • Java基础关键_028_线程(一)
  • 3.24前端模拟面试
  • C语言基础系列【28】指针进阶1:深入理解指针
  • go test相关命令
  • 医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
  • 珠海网站建设推广方案/正版搜索引擎优化
  • 搭建个官网需要多少钱/十堰seo优化方法
  • 网站内容上传/网站推广和优化的原因
  • 做电影网站 需要进那些群/360搜索推广
  • 企业网站打不开什么原因/企业网站优化报告
  • php做的网站论文/seo优化排名公司