JAVA反射+动态代理

news2024/11/15 17:45:39

一.什么是反射?

      反射就是对封装的成员信息与变量进行编程式访问

 简单来说就是从类里面拿东西 比如属性  或者构造方法

 二.获取Class对象:

获取Class的三种方式

 代码实现:

首先封装一个javabean        Student类

public class Student {
    private String name;
    private  int 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 Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }
    public  void study(){
        System.out.println("学习中");
    }
}

测试类:

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种  全类名 包名+类名  常用

        Class student = Class.forName("Student");
        System.out.println(student);
//第二种  .class文件  传递参数
        Class c=Student.class;
        //第三种 有对象
        Student s=new Student();
        Class cc=s.getClass();
        System.out.println(c+cc);
    }
}

 利用反射获取构造方法

java中的类 Constructor  可以获取构造方法

 测试类: 

Student的代码在上面给出了这里就不发了

import java.lang.reflect.Constructor;

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
     

        Class student = Class.forName("Student");
        Constructor [] cs= new Constructor[]{student.getConstructor()};
        for (Constructor c : cs) {
            System.out.println(c);
        }
        //其他方法请自行测试

    }
}

利用反射获取成员变量

 测试类 

student类在上面给出了 只是没有封装公共的成员变量

自己在Stident类里面添加一个 下面的代码就打印出内容

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {


        Class student = Class.forName("Student");
        Field[] f=student.getFields();
        for (Field field : f) {
            System.out.println(field);
        }

        //其他方法请自行测试

    }
}

利用反射获取成员方法

测试类 

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {


        Class student = Class.forName("Student");
        Method [] s=student.getMethods();
        //得到所有方法 返回数组 下面用for遍历
        for (Method method : s) {
            System.out.println(method);
        }
        //其他方法请自行测试

    }
}


动态代理:

什么是代理?

帮助对象分担部分职责    

 利用接口来实现代理

ikun类 javabean

public class ikun {
    private String name;
    private  int 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 ikun(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public ikun() {
    }
    public  void study(String tall){
        System.out.println(tall);
    }
}

 接口:

public interface daili {
    public abstract  void study(String tall);
}

利用proxy类 实现动态代理:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class proutil {
/*
创建方法 利用Proxy 的方法实现动态代理 前提是要先创建好接口
*/
    public static daili create(ikun i) {
        Class []dailiClass = new Class[]{daili.class};
  daili daili= (daili) Proxy.newProxyInstance(proutil.class.getClassLoader(), dailiClass, new InvocationHandler() {
      /*
       * 动态代理  第一个参数指定类加载器  由谁来加载代理
       * 第二个参数就是指定代理
       * 参数三 指定代理的行为
       *
       * */
      @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("代理");
                //这里是可以用反射去实现动态代理的  大家可以自己去尝试
          if ("study".equals(method.getName())){
              System.out.println("测试代码成功");
          }
                return null;
                /*这里指定的参数一  是代理的对象
                参数二.代理要运行的方法
                参数三.调用方法时传递的实际参数
                * */

            }
        });
        return daili;
    }
}

测试类: 

public class dondemo {
    public static void main(String[] args) {
       ikun i=new ikun();
     daili d=  proutil.create(i).study("你好");
    }
}

如果有帮助到您  可以点个关注谢谢!阿里嘎多

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Makerbase_VESC 常用VESC TOOL配置(一)

VESC TOOL电机配置(一) 欢迎加入 创客基地 电机控制企鹅群 讨论电机控制相关问题:732557609 欢迎光临 创客基地 tao宝店 采购产品: https://makerbase.taobao.com/ 提示:可以按快捷键“CtrlF”快速寻找相关问题。 …

微信聊天记录删除恢复导出工具(文字/语音/图片/视频/文件/表情包)

微信的聊天记录加密保存在电脑中,有时我们想将自己微信中的聊天记录导出来,但微信软件并不提供该功能。此软件可将自己电脑版微信中的聊天内容批量导出来,方便备份,后期不登录也可方便快速查阅。它还能够尝试恢复之前删除过的好友…

echarts 饼图 图例在右侧时,文字在图例点右边

echarts图例在右侧时,文字在图例点右边 需求 现在实现的 实现需求 主要使用的参数: legend.align ’left‘代码: 可直接放到echarts示例中使用 option {tooltip: {trigger: item},legend: {orient: "vertical" /*标签文字垂…

【Java从0到1学习】13 Java IO流

1. 流 1.1 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的…

揭开波动性的神秘面纱【02/2】:简要介绍预测市场走势

一、说明 本文是数据专家的体会,他之前写了一系列关于时间序列的文章,在这些文章之后,他想给出一个关于我们如何通过投资组合分析在潜在风险情况下将自己保持在安全区域的想法。文章专业性很强,但机器学习方面的工作还是有参考价值…

【LeetCode】409. 最长回文串

409. 最长回文串(简单) 方法:哈希表 贪心 思路 不难发现,回文字符串一定是由 若干偶数个字符 至多一个奇数个字符 组成 。我们可以使用一个长度为 128 的 hash表来记录每一个字符的出现次数,当该字符出现了两次&am…

企业想用CRM提高销售业绩该如何操作?

在当今市场环境中,客户的需求更偏向于个性化,企业面对的竞争更加激烈。如何有效地获取和维护客户,提高收入成为了企业的核心问题。作为一种强大的销售管理工具,CRM如何提高销售业绩? 提高客户转化率: 企业…

Day50|动态规划part11:188.买卖股票的最佳时机IV、123. 买卖股票的最佳时机III

188. 买卖股票的最佳时机IV leetcode链接:188 题「买卖股票的最佳时机 IVopen in new window」 视频链接:动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4 给你一个整数数组 prices 和一…

基于ssm车库智能管理平台源码和论文

基于ssm车库智能管理平台源码和论文092 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 选题的根据:1)说明本选题的理论、实际意义 2)综述国内外有关本选题的研究动态和自己…

【LeetCode75】第四十一题 二叉搜索树中的搜索

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个搜索二叉树,让我们找出节点值等于目标的节点并返回出去。 首先我们可以直接遍历整棵二叉树,找到值…

Mybatis2,注解实现CRUD

2,注解实现CRUD 使用注解开发会比配置文件开发更加方便。如下就是使用注解进行开发 Select(value "select * from tb_user where id #{id}") public User select(int id);注意: 注解是用来替换映射配置文件方式配置的,所以使用了…

使用 Privoxy 在 Linux 上配置本地代理服务器详细教程

Privoxy 是一个功能强大的开源网络代理软件,它可以帮助我们在 Linux 系统上搭建本地代理服务器。通过配置和使用 Privoxy,您可以实现更安全、匿名以及自定义过滤规则等高级特性。本文将详细介绍如何在 Linux 环境下利用 Privoxy 配置并运行本地代理服务器…

文字转语音怎么转?几种简单转换方法快速转换

将文本转换为语音,可以帮助那些有视觉障碍的人士更便捷地获取信息,以便于听觉上的理解和处理。对于那些需要进行多任务处理的人士,例如在开车或做家务时需要获取信息的人,文字转语音也可以提供便利。那么怎么将文字转换成语音呢&a…

【100天精通python】Day47:python网络编程_Web编程,前后端以及静态服务器

目录 1 网络编程与web编程 1.1 网络编程 1.2 web编程 1.3 前后端交互的基本原理 2 Web开发基础 2.1 HTTP协议 2.2 Web服务器 2.3 前端基础 2.3.1 HTML(超文本标记语言) 2. 3.2 CSS(层叠样式表) 2.3.3 JavaScript 2.…

【pyqt5界面化工具开发-1】运行界面程序框架+按钮+文本+位置的设置

目录 一、运行界面化框架 二、基础控件 目标1:新增按钮 目标2:新增文本: 目标3:设置位置 一、运行界面化框架 import sysfrom PyQt5.QtWidgets import QApplication,QWidgetif __name__ __main__:# 接收参数(仅…

数据库的备份与分类以及日志

目录 1、数据库的概念 1.1、数据备份的重要性 1.2、造成数据丢失的原因 1.3、 数据库备份的分类 1.3.1、从物理与逻辑的角度, 1.3.2、原理图 1.3.3.1 完全备份: 1.3.2.2 差异备份 1.2.3.3、 增量备份 1.3.3、 备份方式比较 1.4、常见的备份方…

pdf转word怎么进行转换?这几种转换技巧别错过

pdf转word怎么进行转换?将PDF转换为Word文档可以带来很多便利。一些人可能需要编辑PDF文件中的文本或者图片,但是PDF文件通常不易于编辑。将PDF文件转换为Word文档之后,就可以像编辑普通Word文档一样轻松地编辑它们。那么今天小编就来给大家介…

计算机竞赛 基于机器视觉的火车票识别系统

文章目录 0 前言1 课题意义课题难点: 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖,适合作为竞赛…

IntelliJ IDEA2021.3.1 使用 MybatisCodeHelperPro插件

一、 下载 下载破解后的 MybatisCodeHelperPro 的 V3.2.2版本 V3.2.2-CSDN 或者 V3.2.2-Gitee 二、 应用 将下载下来的Zip文件 放到电脑上的某个位置 (最好放在Idea 管理插件的 plugins 下) 然后自从搜索 Idea如何从磁盘中应用插件 三、激活 由于已经破解过了 但是还是需要激活…

基于信息增益的特征重要性分析

培训和测试样本 用于模型评估的数据集包括8652个F1杂交玉米样本,这些样本具有测量的抽穗天数(DTT)、株高(PH)和穗重(EW)表型,这些表型来自母体库和30名父系测试者小组的杂交&#x…