反射及动态代理

反射

        定义:

                反射允许对封装类的字段,方法和构造 函数的信息进行编程访问

                

                                                                        图来自黑马程序员 

        获取class对象的三种方式:

                1)Class.forName("全类名")

                2)类名.class

                3) 对象.getClass()

                

                                                                         图来自黑马程序员  

                

package com.lazyGirl.reflectdemo;public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//最常见Class clazz = Class.forName("com.lazyGirl.reflectdemo.Student");System.out.println(clazz);Class clazz2 = Student.class;System.out.println(clazz2);System.out.println(clazz == clazz2);Student student = new Student();Class clazz3 = student.getClass();System.out.println(clazz3);System.out.println(clazz == clazz3);}
}

        输出:

         

 获取构造方法:

                                                                     图来自黑马程序员  

package com.lazyGirl.reflectdemo.demo1;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class clazz = Class.forName("com.lazyGirl.reflectdemo.demo1.Student");Constructor[] cons = clazz.getConstructors();for (Constructor c : cons) {System.out.println(c);}System.out.println();Constructor[] cons1 = clazz.getDeclaredConstructors();for (Constructor c : cons1) {System.out.println(c);}System.out.println();Constructor cons2 = clazz.getDeclaredConstructor();System.out.println(cons2);System.out.println();Constructor cons3 = clazz.getDeclaredConstructor(String.class);System.out.println(cons3);System.out.println();Constructor cons4 = clazz.getDeclaredConstructor(int.class);System.out.println(cons4);System.out.println();Constructor cons5 = clazz.getDeclaredConstructor(String.class, int.class);System.out.println(cons5);int modifiers = cons5.getModifiers();System.out.println(modifiers);System.out.println();Parameter[] parameters = cons5.getParameters();for (Parameter p : parameters) {System.out.println(p);}cons5.setAccessible(true);Student stu = (Student) cons5.newInstance("hhh",16);System.out.println(stu);}
}

        输出:

         

 获取成员变量:

                                                                 图来自黑马程序员  

package com.lazyGirl.reflectdemo.demo2;import java.lang.reflect.Field;public class Demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class clazz = Class.forName("com.lazyGirl.reflectdemo.demo2.Student");Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field.getName());}System.out.println();Field[] declaredFields = clazz.getDeclaredFields();for (Field field : declaredFields) {System.out.println(field.getName());}System.out.println();Field gender = clazz.getField("gender");System.out.println(gender);System.out.println();Field declaredName = clazz.getDeclaredField("name");System.out.println(declaredName);System.out.println();int modifiers = declaredName.getModifiers();System.out.println(modifiers);String name = declaredName.getName();System.out.println(name);System.out.println();Class<?> type = declaredName.getType();System.out.println(type);Student student = new Student("hhh",16,"女");declaredName.setAccessible(true);Object value = declaredName.get(student);System.out.println(value);declaredName.set(student,"hhhh");System.out.println(student);}
}

输出:

获取成员方法:

                                                         图来自黑马程序员 

package com.lazyGirl.reflectdemo.demo3;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class Demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class clazz = Class.forName("com.lazyGirl.reflectdemo.demo3.Student");//包含父类的方法
//        Method[] methods = clazz.getMethods();//不能获取父类方法,但是可以访问私有方法Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println(method);}Method method = clazz.getMethod("eat", String.class);System.out.println(method);int modifiers = method.getModifiers();System.out.println(modifiers);String name = method.getName();System.out.println(name);Parameter[] parameters = method.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}Class[] exceptions = method.getExceptionTypes();for (Class exception : exceptions) {System.out.println(exception);}Student student = new Student();method.invoke(student,"cake");}
}

Student类:

package com.lazyGirl.reflectdemo.demo3;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void sleep(){System.out.println("sleep");}public void eat(String food) throws InterruptedException,ClassCastException{System.out.println("eat " + food);}public void eat(String food, int time){System.out.println("eat " + food + " " + time);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

输出:

作用:

        获取一个类里面所有的信息,获取到了之后,再执行其他业务逻辑

        结合配置文件,动态的创建对象并调用方法

        

package com.lazyGirl.reflectdemo.demo5;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class Test {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Properties prop = new Properties();FileInputStream fis = new FileInputStream("pro.properties");prop.load(fis);fis.close();System.out.println(prop);String classname = (String) prop.get("classname");String methdName = (String) prop.get("method");System.out.println(classname);System.out.println(methdName);Class clazz = Class.forName(classname);Constructor constructor = clazz.getConstructor();Object o = constructor.newInstance();System.out.println(o);Method method = clazz.getDeclaredMethod(methdName);method.setAccessible(true);method.invoke(o);}
}

        properties文件:

classname=com.lazyGirl.reflectdemo.demo5.Student
method=study

        输出:

 

 动态代理:

        无侵入式的给代码增加额外的功能

        程序为什么需要代理:对象身上干的事太多,可以通过代理来转移部分职业

        对象有什么方法想被代理,代理就一定要有对应的方法

        java通过接口保证对象和代理

        格式:

        

                        图来自黑马程序员

                

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/361009.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024广东省职业技能大赛云计算赛项实战——构建CICD

构建CI/CD 前言 题目如下&#xff1a; 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建&#xff0c;具体要求如下&#xff1a; &#xff08;1&#xff09;基于镜像maven:3.6-jdk-8构建项目的drone分支&#xff1b; &#xff08;2&#xff09;构建镜像的名称&#xff1a…

Qt | 子类化 QStyle(Qt自带图标大全)

01、简介 1、把绘制自定义部件外观的步骤大致分为三大板块,如下: ①、样式元素:即指定需要绘制的图形元素(比如焦点框、按钮,工具栏等)。样式元素使 用 QStyle 类中的一系列枚举(共有 11 个枚举)进行描述。 ②、样式选项:包含了需要绘制的图形元素的所有信息,比如包含…

DDR3控制器(一)DDR3 IP调用

目录 一、DDR3 IP核简介 二、DDR3 IP核调用 在千兆以太网通信中用到了DDR3控制器&#xff0c;但是并没有对其做相关介绍。这次准备重新整理一下DDR3控制相关知识&#xff0c;复习巩固一下。 一、DDR3 IP核简介 MIG IP核&#xff08;Memory Interface Generator&#xff09;是…

【ajax基础04】form-serialize插件

目录 一&#xff1a;form-serialize插件 作用&#xff1a; 语法格式&#xff1a; 一&#xff1a;form-serialize插件 作用&#xff1a; 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形&#xff0c;单靠通过”选择器获取节点.value”值的形式&#xff0c;获取…

QEMU + Vscode + Arm Arch‘s Linux调试小记

目录 下载QEMU 下载aarch64-gcc 下载BusyBox 编译linux 6.9.5的内核 启动&#xff01; 链接到vscode进行远程调试 Reference 前几天看到了一篇讲授如何调试ARM Linux内核的文章&#xff0c;这里现在记录一下调试ARM Linux内核的办法 下载QEMU 对于Arch Linux用户而言&a…

如何集成CppCheck到visual studio中

1.CPPCheck安装 在Cppcheck官方网站下载最新版本1.70&#xff0c;官网链接&#xff1a;http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS&#xff0c;菜单栏工具->外部工具->添加&#xff0c;按照下图设置&#xff0c;记得勾选“使用输出窗口” 2.…

考研数学一有多难?130+背后的残酷真相

考研数学一很难 大家平时在网上上看到很多人说自己考了130&#xff0c;其实这些人只占参加考研数学人数的极少部分&#xff0c;有个数据可以展示出来考研数学到底有多难&#xff1a; 在几百万考研大军中&#xff0c;能考到120分以上的考生只有2%。绝大多数人的分数集中在30到…

回购注销高管减持,东软集团的“大手笔”有意义吗?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 作为老牌软件巨头&#xff0c;东软集团这两年的业绩着实有些不够看。 看财报数据&#xff0c;22年东软集团营收94.66亿&#xff0c;净亏损3.47亿&#xff0c;扣非净利利润-5.30亿。23年&#xff0c;集团营收105.44亿&#x…

华为OD机试【高矮个子排队】(java)(100分)

1、题目描述 现在有一队小朋友&#xff0c;他们高矮不同&#xff0c;我们以正整数数组表示这一队小朋友的身高&#xff0c;如数组{5,3,1,2,3}。 我们现在希望小朋友排队&#xff0c;以“高”“矮”“高”“矮”顺序排列&#xff0c;每一个“高”位置的小朋友要比相邻的位置高或…

5000天后的世界:科技引领的未来之路

**你是否想过&#xff0c;5000天后的世界会是什么样子&#xff1f;** 科技日新月异&#xff0c;改变着我们的生活方式&#xff0c;也引领着人类文明的进程。著名科技思想家凯文凯利在他的著作《5000天后的世界》中&#xff0c;对未来进行了大胆的预测。 **这本书中&#xff0c…

SpringBoot学习04-[定制SpringMVC]

定制SpringMVC 定制SpringMvc的自动配置定制springmvc-configurePathMatch配置 定制SpringMvc的自动配置 SpringMvc的自动配置类&#xff1a;WebMvcAutoConfiguration 1、在大多数情况下&#xff0c;SpringBoot在自动配置中标记了很多ConditionalOnMissingBean&#xff0c;我们…

智慧互联:Vatee万腾平台展现科技魅力

随着科技的迅猛发展&#xff0c;我们的生活正逐渐变得智能化、互联化。在这个信息爆炸的时代&#xff0c;一个名为Vatee万腾的平台正以其独特的魅力&#xff0c;引领我们走向一个更加智能的未来。 Vatee万腾&#xff0c;这个名字本身就充满了对科技未来的憧憬与期待。作为一家专…

吴恩达揭秘:编程Agent如何革新软件开发行业

作为 AI 领域的杰出人物&#xff0c;吴恩达教授对编程 Agent 的兴起表示了极大的兴趣。他认为&#xff0c;编程 Agent 有潜力通过自动执行繁琐的任务、提高代码质量和加速开发周期来彻底改变软件开发行业。 本文将深入探讨吴恩达对编程 Agent 的见解&#xff0c; 多代理系统质…

Vmvare12安装CentOS7.6

Vmvare12安装 注意事项 安装完成以后有这两个虚拟网卡。 CentOS官网镜像地址 https://www.centos.org/download/mirrors/Vmvare安装CentOS7.6 创建虚拟机 安装CentOS7.6 选择桌面版 磁盘分区 上述是确认使用自动分区。 设置密码 设置license information 欢迎页面 CentOS7…

web前端大作业--美团外卖1

文章目录 概述代码截图代码链接 概述 web美团 登录和注册功能、页面展示。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href&quo…

锐捷统一上网行为管理与审计系统 static_convert.php 前台RCE漏洞复现

0x01 产品简介 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,具备的上网行为日志审计功能,能够全面、准确、细致的审计并记录多种上网行为日志,包括网页、搜索、外发文件、邮件、论坛、IM等等,并对日志数据进行统计分析,…

数据结构历年考研真题对应知识点(栈)

目录 3.1栈 3.1.1栈的基本概念 【栈的特点&#xff08;2017&#xff09;】 【入栈序列和出栈序列之间的关系(2022)】 【特定条件下的出栈序列分析(2010、2011、2013、2018、2020)】 3.1.2栈的顺序存储结构 【出/入栈操作的模拟(2009)】 3.1栈 3.1.1栈的基本概念 【栈…

DIY 智能门禁:用 ESP32 RFID 打造安全便捷的家居体验 (附代码)

一、系统概述 本项目旨在使用 ESP32 微控制器和 RFID 技术构建一个安全可靠的门禁系统。该系统利用 RFID 卡进行身份验证&#xff0c;通过读取卡内存储的唯一 ID&#xff0c;判断用户权限并控制门锁的开关。ESP32 强大的 Wi-Fi 功能还能实现远程监控和管理&#xff0c;方便用户…

代码随想录算法训练营day31|134.加油站、135. 分发糖果、406.根据身高重建队列

134.加油站 如下图所示&#xff1a; 当索引一道2的时候&#xff0c;剩余油量的总量13-6 < 0&#xff0c;这个时候说明以索引0为起点不合适&#xff0c;将起点更新为索引3. 两点证明&#xff1a; 1.如果我们从蓝色段中间选一个点开始&#xff0c;是不是最后sumGas就不小于0…

C语言数据结构-分析期末选择题考点(一)

昔我往矣&#xff0c;杨柳依依 今我来思&#xff0c;雨雪霏霏 契子✨ 有道是&#xff1a;得选择题者得天下。临近考试&#xff0c;便总结一下数据结构选择题的常考题型吧&#xff0c;以及预测一下考点&#xff0c;一来是为了备考&#xff0c;二来可以水文。祝各位老铁 “挂柯南…