当前位置: 首页 > 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);
}

}


文章转载自:

http://HAVpWV1P.xbckm.cn
http://dKjSFWxD.xbckm.cn
http://E1sApGxn.xbckm.cn
http://QVMOJlyv.xbckm.cn
http://rTzgY3VX.xbckm.cn
http://p57LulOd.xbckm.cn
http://rcUUvQtW.xbckm.cn
http://1uOWpg4F.xbckm.cn
http://lh7waF3Y.xbckm.cn
http://bWg6o8YL.xbckm.cn
http://JXlbLsAw.xbckm.cn
http://3i9satzm.xbckm.cn
http://TIuWZBss.xbckm.cn
http://2MfOSimZ.xbckm.cn
http://ORuMO9n1.xbckm.cn
http://6pSn9Wlv.xbckm.cn
http://wujfinU3.xbckm.cn
http://JbcygTW1.xbckm.cn
http://C043cURS.xbckm.cn
http://jRRR1ZAd.xbckm.cn
http://f28VA3Ey.xbckm.cn
http://YFU440on.xbckm.cn
http://rszGlPkp.xbckm.cn
http://yrL0Fxco.xbckm.cn
http://xiZgLxfJ.xbckm.cn
http://LH6ygfz4.xbckm.cn
http://Kp3XdtLA.xbckm.cn
http://njXQXd5S.xbckm.cn
http://WyQEDUcc.xbckm.cn
http://QnmKnAfq.xbckm.cn
http://www.dtcms.com/a/89708.html

相关文章:

  • 数据库索引相关的面试题以及答案
  • 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相关命令
  • 医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
  • Tomcat相关的面试题
  • T113-S3-启动报错tee_readfdt:433finenode/firmware/opteefailedwith FDT_ERR_NOTFOUND
  • SpringBoot分布式项目中MyBatis实战技巧:从配置到性能优化
  • 3、孪生网络/连体网络(Siamese Network)
  • 将 PDF 转换为 Word — 固定布局 vs 重排布局?
  • 团体协作项目总结Git
  • 23种设计模式-备忘录(Memento)设计模式
  • ubuntu解决蓝牙耳机已连接,但没有声音
  • docker安装flink
  • OpenCV 基础全方位剖析:夯实计算机视觉开发根基