反射及动态代理

news2024/11/19 7:46:29

反射

        定义:

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

                

                                                                        图来自黑马程序员 

        获取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);
    }

    @Override
    public 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.coloradmin.cn/o/1863806.html

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

相关文章

使用Tailwindcss之后,vxe-table表头排序箭头高亮消失的问题解决

环境 vue2.7.8 vxe-table3.5.9 tailwindcss/postcss7-compat2.2.17 postcss7.0.39 autoprefixer9.8.8 问题 vxe-table 表格表头 th 的排序箭头在开启正序或逆序排序时&#xff0c;会显示蓝色高亮来提示用户表格数据处在排序情况下。在项目开启运行了tailwindcss之后&#xff0…

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

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

经典老动画电影大全,老动画片大全集全部百度网盘,资源下载百度云

当今社会越来越重视学前教育了&#xff0c;今儿童启蒙的教育也越来越受人们的关注和重视。为了满足社会对未来人才的需要&#xff0c;学前教育成为当今教育领域重要角色的一环。当今动画篇是主流&#xff0c;内容精彩纷呈&#xff0c;越来越受到儿童的喜爱。 儿童的语言敏感期&…

【PL理论深化】(7) Ocaml 语言:静态类型语言 | 自动类型推断 | 多态类型和多态函数 | let-多态类型系统

&#x1f4ac; 写在前面&#xff1a;OCaml 是一种拥有静态类型系统的语言&#xff0c;本章我们就要探讨静态类型系统。 目录 0x00 静态类型系统 0x01 自动类型推断&#xff08;automatic type inference&#xff09; 0x02 多态类型和多态函数 0x03 let-多态类型系统&#…

php,python AES/CBC/PKCS7Padding加密解密 base64/hex编码

1. python版本 import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpadclass AESUtilCBC:def __init__(self, key, iv):self.key key.encode(utf-8)self.iv iv.encode(utf-8)self.pad_length AES.block_sizedef encrypt(self, data):try…

最佳实践 | HelpLook通过PartnerShare实现低成本的市场拓展

在如今许多行业市场竞争非常激烈&#xff0c;扩大品牌影响力、提升产品竞争力成为企业亟待攻克的难题之一。为此&#xff0c;HelpLook AI知识库对接了PartnerShare联盟系统&#xff0c;为SaaS产品如何做好全民分销带来了全新的解决思路。 PartnerShare凭借成熟的推广体系为Hel…

一张图了解KFS

供稿&#xff1a;产品研发中心、战略市场部 编辑&#xff1a;薇薇 审核&#xff1a;日尧

源站静态文件更新后,CDN会自动刷新吗

源站静态文件更新后&#xff0c;CDN不会自动刷新缓存&#xff0c;而是在缓存时间过期后&#xff0c;才会经由用户触发回源获取最新文件。如希望在缓存过期时间之前&#xff0c;实现CDN节点与源站静态文件同步更新&#xff0c;则需要通过CDN控制台-【刷新预取】菜单&#xff0c;…

前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序

这一小节&#xff0c;我们说一下前端 js-tool-big-box 这个工具库&#xff0c;添加的数值型数组的正向排序和倒向排序。 以前呢&#xff0c;我们的数组需要排序的时候&#xff0c;都是在项目的utils目录里&#xff0c;写一段公共方法&#xff0c;弄个冒泡排序啦&#xff0c;弄…

量化交易面临的难题

量化交易面临的难题 1、监管机构对于算法交易、量化交易的监管越来越严格3、回测场景于实盘交易场景的不匹配性4、策略并非100%有效&#xff0c;并非100%的收益5、股票、基本面、市场新闻之间的关系时刻在变化并且难以捉摸6、很难使用一套通用的交易规则去匹配所有的股票/市场/…

React Native V0.74 — 稳定版已发布

嗨,React Native开发者们, React Native 世界中令人兴奋的消息是,V0.74刚刚在几天前发布,有超过 1600 次提交。亮点如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects让我们深入了解每一个新亮点…

OElove 婚恋系统 v10.2升级真是及时,你们是不是UI团队换了?不得不说这次UI是真美!当然功能也升级了大大的赞!

怎么说呢&#xff0c;成为OE的老用户已经有五年了&#xff0c;当时买的初衷就是在本地做一个响当当的门户但是因为疫情搁浅了。。。实在是入不敷出&#xff01;转行的这几年又看好了婚恋这个行业于是打算冲头再来&#xff0c;我记得我当时还是8.5&#xff0c;功能比较强大就是太…

CppTest单元测试框架(更新)

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 使用方法 1 背景 前面文章单元测试之CppTest测试框架中讲述利用宏ADD_SUITE将测试用例自动增加到测试框架中。但在使用中发现一个问题&#xff0c;就是通过宏ADD_SUITE增加多个测试Suite时&#xff0c;每次运行时都是所有测试Suit…

内附下载方式 | 移远通信《5G RedCap技术发展及应用白皮书》重磅发布

6月25日&#xff0c;在2024 MWC上海前夕&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式发布其《5G RedCap技术发展及应用白皮书》。 该白皮书对RedCap的技术特点、市场趋势及应用场景进行了全面分析&#xff0c;基于5G技术的发展和演进&#xff…

Kafka入门-基础概念及参数

一、Kafka术语 Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与订阅解决方案。可以为每个业务、每个应用甚至是每类数据都创建专属的主题。 Kafka的服务器端由被称为Broker的服务进程构成&#xff0c;即一个Kafka集群由多个Broker组成&#…

一款开源、高颜值的AI物联网数据平台

介绍 AIOT人工智能物联网平台是一站式物联网开发基础平台&#xff0c;帮助企业快速实现数字化、精细化数据管理。核心系统为&#xff1a;物联网平台 数据中台&#xff08;数据底座&#xff09; AI。 同时支持文生图、语音合成等。大模型支持陆续也会慢慢开发。 物联系统介绍…

STM32存储左右互搏 模拟U盘桥接QSPI总线FATS读写FLASH W25QXX

STM32存储左右互搏 模拟U盘桥接QSPI总线FATS读写FLASH W25QXX STM32的USB接口可以模拟成为U盘&#xff0c;通过FATS文件系统对连接的存储单元进行U盘方式的读写。 这里介绍STM32CUBEIDE开发平台HAL库模拟U盘桥接Quad SPI总线FATS读写W25Q各型号FLASH的例程。 FLASH是常用的一种…

【学习】科大睿智解读ITSS通过后仍需关注和改进IT服务的原因

为了确保IT服务的质量和效率&#xff0c;很多企业拿到ITSS资质证书后&#xff0c;仍然需要持续关注和改进IT服务&#xff0c;科大睿智总结主要原因有以下几点&#xff1a; 1、随着企业发展业务和市场行情的变化&#xff0c;可能涉及到运维服务中新的业务流程、技术需求或者用户…

[深度学习] 门控循环单元GRU

门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;是一种用于处理序列数据的递归神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;变体&#xff0c;它通过引入门控机制来解决传统RNN在处理长序列时的梯度消失问题。GRU与长短期记忆网络&#xff0…

Arduino 旋转编码器

Arduino 旋转编码器 电位计 Arduino - Rotary Encoder In this tutorial, we are going to learn how to use the incremental encoder with Arduino. In detail, we will learn: 在本教程中&#xff0c;我们将学习如何将增量编码器与Arduino一起使用。详细来说&#xff0c;…