反射看这一篇文章就够了

news2025/1/11 0:42:57

第一章 反射的概述

第1节 反射的概念

Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制.

第2节 反射理解

1
如果存在反射,那是不是也存在正射?如果存在正射,那么什么是正射呢?
  • 白话正射
1
2
3
4
在编写代码的时,如果使用到了某一个类,首先需要了解这个类是干什么的,然后使用new关键字实例化对象.接着对这个对象进行操作,这就是正射.

Teacher t = new Teacher();//实例化
t.doWork("语文");//调用方法(操作对象)
  • 白话反射
1
反射就是我们不知道要创建对象的类是什么,自然也就无法使用new关键字来创建对象,但是我还想创建对象
  • 正射和反射的对比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
 * 下面是使用正射和反射实现的
 * 功能相同
 */
public class TestDemo02 {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        //正射
      	Teacher t = new Teacher();
        t.doWork("语文");
				//反射
        Teacher obj = (Teacher) createObject("cn.ukoko.Teacher");
        obj.doWork("数学");

    }

    public static Object createObject(String o) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<?> c = Class.forName(o);
        Object obj = c.newInstance();
        return obj;
    }
}
class Teacher{
    void doWork(String w){
        System.out.println("老师批改"+w+"作业...");
    }
}

第二章 反射常见API

1
2
3
4
java.lang.Class: 描述类的类
java.lang.reflect.Method: 描述方法的类
java.lang.reflect.Field: 描述属性的类
java.lang.reflect.Constructor: 描述构造器的类

第1节 Class类

1
2
3
4
5
6
7
Class被称为描述类的类,他也是一个类,从这个类中可以获取一个类的描述信息,比如获取类中属性的信息,方法的信息,构造器的信息等.

1. Class类没有构造方法,他的对象只能由系统创建,不能由程序员创建.
2. 一个类在 JVM 中只会有一个Class实例
3. 一个Class对象对应的是一个加载到JVM中的一个.class文件
4. 每个类的实例都会记得自己是由哪个 Class 实例所生成
5. 通过Class可以完整地得到一个类中的完整结构 
  • Class类的常见方法
方法名功能说明
static Class forName(String name)返回指定类名 name 的 Class 对象
Object newInstance()调用缺省构造函数,返回该Class对象的一个实例
getName()返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称
Class getSuperClass()返回当前Class对象的父类的Class对象
Class [] getInterfaces()获取当前Class对象的接口
ClassLoader getClassLoader()返回该类的类加载器
Constructor[] getConstructors()返回所有public修饰的构造方法
Constructor[] getDeclaredConstructors()返回所有权限修饰的构造方法
Field[] getFields()返回所有的public修饰的属性,包含父类
Field[] getDeclaredFields()返回当前类的所有权限的属性(不包括父类)
Method[] getMethods()返回所有的public修饰的方法(包括父类)
Method[] getDeclaredMethods返回当前类的所有权限的方法(不包括父类)
Annotation[] getAnnotations()返回所有注解(包括父类的注解,父类注解使用@Inherited修饰)
Annotation[] getDeclaredAnnotations()返回当前类的注解
Type getGenericSuperclass()获取父类的泛型类型
ParameterizedTypeParameterizedType是Type的子类getGenericSuperclass()方法返回的对象是ParameterizedType的实例,所以需要造型(向上强转)
Type[] getActualTypeArguments()ParameterizedType中提供了getActualTypeArguments方法,返回泛型类型列表
  • 获取Class类对象的常见3种方式
1
2
3
4
5
6
7
8
9
10
11
12
1. 使用 Class.forName 静态方法
  Class<?> clazz = Class.forName("java.lang.String");
  System.out.println(clazz);//class java.lang.String
  
2. 使用类的.class 方法
	Class<String> clazz = String.class;
  System.out.println(clazz);//class java.lang.String
  
3. 使用实例对象的 getClass() 方法
	String s = new String("xxx");
  Class<? extends String> clazz = s.getClass();
  System.out.println(clazz);//class java.lang.String

第2节 Method类

1
描述方法的方法
  • Method类的常见方法
方法名功能说明
int getModifiers()权限修饰符
String getName()方法名
Class<?>[] getParameterTypes()方法的参数列表类型
Class<?>[] getReturnType()返回值类型
Object invoke(Object obj, Object… args)方法调用

第3节 Field类

1
描述属性的类
  • Field类的常见方法
方法名功能说明
Object get(Object obj)获取指定属性值
int getModifiers()获取属性的权限修饰符
String getName()获取属性的名称
void set(Object obj, Object value)给指定对象的指定属性对象赋值
  • AccessibleObject的常见方法
方法名功能说明
setAccessible(boolean flag)设置权限,比如给私有属性赋值需要开启权限,否则不能赋值

第4节 Constructor

1
描述构造器的类
  • Constructor类的常见方法
方法名功能说明
int getModifiers()获取构造方法的权限修饰符
String getName()获取构造方法的名称
Class<?>[] getParameterTypes()方法的参数列表类型
T newInstance(Object… initargs)构造方法

第5节 其他类和方法

  • ClassLoader类加载器
1
2
3
4
5
类加载器的功能:把类(class)装载进内存中
JVM在运行时会产生3个类加载器
1. 引导类加载器:用C++编写的,是JVM自带的类加载器,负责加载Java平台核心类库
2. 扩展类加载器:负责jre/lib/ext目录下的jar包或 –D java.ext.dirs 指定目录下的jar包装入工作库
3. 系统类加载器:负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工作
  • 类加载的过程

 

  • 类加载器的获取
1
Class类中提供了获取类加载器的方法,所以要获取一个类的类加载器首先就是获取这个类的Class实例,然后调用类加载器方法获取类加载器
  • 类加载器中的重要方法
1
2
3
ClassLoader cl = TestDemo.class.getClassLoader();
//可以获取一个文件的输入流
InputStream in = cl.getResourceAsStream("db.properties");

第三章 动态代理

  • 代理模式的定义
1
2
3
4
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用

1. 目标代理对象(源对象)
2. 代理对象
  • 静态代理的实现

    • 公共接口
    1
    2
    3
    4
    5
    6
    
    public interface Boss {
        /*
            签字
         */
        void sign();
    }
    
    • IT老板
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    /*
        目标代理类
    */
    public class ItBoss implements Boss {
        @Override
        public void sign() {
            System.out.println("IT老板签字...");
        }
    }
    
    • IT秘书
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    /*
      代理类
    */
    public class Secretary implements Boss {
    
        /*
            目标代理对象
         */
        private Boss boss;
    
        public Secretary(Boss boss) {
            this.boss = boss;
        }
    
        @Override
        public void sign() {
            /*
                代理对象方法,调用目标代理对象方法
             */
            boss.sign();
        }
    }
    
  • 静态代理的局限

1
静态代理设计,每一个代理类只能代理一个接口,如果在项目中需要对多个接口生成代理,这样程序开发中就会产生过多代理不易维护.
  • 动态代理的实现

    • JDK动态代理
    1
    2
    3
    
    JDK自带的动态代理类java.lang.reflect.Proxy实现动态代理
    优点: 简单、方便
    缺点: 只能代理接口,不能代理类
    
    • CGLIB动态代理
    1
    2
    
    开源,功能强大高性能的代码生成库
    优点: 可以代理类
    

    目标代理类

    1
    2
    3
    4
    5
    6
    
    public class ITBoss {
    	//签名
    	void sign() {
    		System.out.println("IT老板签名...");
    	}
    }
    

    测试

    ```java
    public class TestDemo01 {
    public static void main(String[] args) {

        //1.创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        //2.指定被代理对象的Class
        enhancer.setSuperclass(ITBoss.class);
        //3.设置方法的拦截以及回调
        enhancer.setCallback(new MethodInterceptor() {
            /*
             * obj:被代理对象
             * method:原方法
             * args:方法入参
             * methodProxy:代理的方法
             */
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                return methodProxy.invokeSuper(obj, args);
            }
        });
        //创建代理对象
        ITBoss boss = (ITBoss) enhancer.create();
        System.out.println(boss);//指向的是代理对象com.hy.ITBoss$$EnhancerByCGLIB$$3e50753c@7506e922
        boss.sign();
    }

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

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

相关文章

实现 SpringBoot 项目中的隐私数据脱敏

实现 SpringBoot 项目中的隐私数据脱敏什么是数据脱敏如何实现数据脱敏注解使用demo什么是数据脱敏 为了避免“用户信息泄露”的风险项&#xff08;就是后台系统里用户的一些隐私数据直接明文显示了&#xff09;&#xff0c;其实指的就是要做数据脱敏。数据脱敏&#xff1a;把…

谷歌浏览器自带的翻译功能无法使用的解决办法

谷歌浏览器自带的翻译功能无法使用的解决办法 到 C:\Windows\System32\drivers\etc 目录找到hosts文件用记事本或者notepad打开在文件末尾添加&#xff1a;142.250.4.90 translate.googleapis.com要有管理员的身份才可以对hosts文件进行修改修改完毕以后&#xff0c;打开cmd命令…

MySQL 如何查找删除重复行

如何查找重复行 第一步是定义什么样的行才是重复行。多数情况下很简单&#xff1a;它们某一列具有相同的值。本文采用这一定义&#xff0c;或许你对“重复”的定义比这复杂&#xff0c;你需要对sql做些修改。本文要用到的数据样本&#xff1a; create table test(id int not …

解决Vue使用UEditor百度编辑器,上传图片服务配置问题

前言 查看文档前先查看http://fex.baidu.com/ueditor/#server-jsp 理解手册基本配置 此文档只针对TomcatWeb服务 vue版本为2.0版本和 vue-cli2.0 环境配置 需求配置实际项目配置JDK 1.6java version “19.0.1” 2022-10-18Apache Tomcat 6.0Server version: Apache Tomcat…

狂神说笔记——Nginx快速入门28

Nginx快速入门 在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 随着用户越来越多了&#xff0c;并发量慢慢增大了&#xff0c;此时一台服务器满足不了需求了。 于是进行横向扩展&#xff0c;又增加了服务器。这个时候几个项目…

VTK-路径规划

前言&#xff1a;本博文主要研究VTK中路径规划相关的内容&#xff0c;后期会持续更新路径规划相关的拓展应用&#xff0c;希望能给各位小伙伴一些帮助&#xff0c;也希望小伙伴们多多关注支持。 vtkGraphGeodesicPath 位置&#xff1a;..\Filter\Modeling 描述&#xff1a;路…

DDS 发送大数据

Sending Large DataThis section describes the capabilities offered by Connext DDS—specifically, RTI FlatData™ language binding and Zero Copy transfer over shared memory—that allow sending and receiving large data samples with minimum latency. In this sec…

Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)

Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)正在上传…重新上传取消To Bottom 文档内容 用途适用范围详细信息关于新的 Autoupgrade utility步骤 1: 升级到数据库 19c 的升级路径能够直接升级到 Oracle 19c 的数据库最小版本以下…

mongodb-18.聚合查询练习1

文章目录bulk writeaddFields增加field嵌套增加field覆盖显示用变量替换向数组中增加元素分组 bucket并行执行多个bucket$bucketAuto$count$document$facet1.使用Aggregation对象实现2.使用Aggregates实现$graphLookup 文档递归查询跨多文档递归$graphLookupbulk write db.piz…

第四十二讲:神州防火墙路由模式的初始配置

防火墙作为局域网的智能网关&#xff0c;处于内网和外网之间&#xff0c;必须工作在路由模式。路由模式下&#xff0c;防火墙上添加默认路由&#xff0c;配置SNAT转换&#xff0c;隐藏私有地址&#xff0c;内部用户正常访问外网。从安全考虑&#xff0c;内网处于trust区域&…

《2022年度ASA广告表现报告》生成,探索买量新高度!

回首 2022 年&#xff0c;ASA 广告的历程可以用“变化莫测”来形容&#xff0c;CPP 取代创意集、更新《广告指南》、上线新广告位等等&#xff0c;而这一系列改变&#xff0c;都在一定程度上影响着 ASA 广告的投放。一起来看看 2022 年度全球 ASA 广告的投放情况吧&#xff01;…

日常使用的WhatsApp如何防止被封?

最近好多做外贸的朋友反映&#xff0c;自己手机号码注册的WhatsApp账号被封了&#xff0c;该如何将解封。首先我们先要了解为什么会被封&#xff1f;被封肯定是因为违反了WhatsApp条款和条件&#xff0c;但是具体如何违反的呢&#xff1f;我们一起来看看你没有这样做过&#xf…

【express】中间件

中间件&#xff08;Middleware&#xff09;&#xff0c;特指业务流程的中间处理环节 1、调用流程 当一个请求到达Express的服务器之后&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。 2、格式 Express的中间件&#xff0c;本质上就是一个functio…

repeat语句 及 赋值语句说明---verilog HDL

参考&#xff1a;verilog数字系统设计教程【第四版】夏宇闻 repeat语句用阻塞赋值语句&#xff0c;与用非阻塞语句产生的结果差别非常大&#xff0c;所以将二者放在同一篇文章中。 1、赋值语句 2、repeat 语句介绍   2.1、用法要点   2.2、代码举例    代码1&#xff1a;…

2023年北向L2接口的发展会怎么样?

众所周知北向L2接口的逐笔成交功能可以精确查看每笔成交&#xff0c;跟踪北向资金动向&#xff0c;那么由于北向资金动向是股市行情的晴雨表&#xff0c;因此股民做股票投资是要时刻关注着北向资金流动方向的&#xff0c;那么北向L2接口作为帮助头者提供跟踪资金动向的服务软件…

浅谈撮合引擎

浅谈撮合引擎设计撮合引擎简介撮合引擎的发展币安中小型交易所小型交易所业务交易流程竞价方式交易所常用指令开发简易架构设计撮数据结构设计交易委托账本限价委托单其它委托单关键代码实现1.创建一个ringbuffer2. 设置事件监听4.订单撮合主逻辑撮合分支processMath函数逻辑PS…

uniapp实现iOS支付苹果内购支付踩过的坑以及具体操作步骤

由于我们app会员属于虚拟产品&#xff0c;所以苹果商店要求我们必须选择苹果内购&#xff0c;否则就勒令下架。 无奈&#xff0c;于是就又开始了踩坑之旅~ uniapp可以直接使用uni-pay的插件去进行苹果内购。 但是&#xff0c;在对接自己的项目之前&#xff0c;建议先跑通示例项…

JavaEE-Spring(Spring中的五大类注解,@Bean注解,对象装配(@Autowired,@Resource),Bean对象在Spring中的作用域)

文章目录1. 配置扫描路径2. Spring五大类注解3. Spring Bean注解对象装配4. Bean对象在Spring中的作用域5. Bean生命周期1. 配置扫描路径 只有设置了扫描路径&#xff0c;其他的路径下注解不会被Spring扫描 这里设置路径为com.beans下 <?xml version"1.0" enc…

(七)devops持续集成开发——jenkins流水线发布一个node环境下的前端vue项目

前言 在前面的章节中已经介绍了jenkins集成前端流水化部署环境的内容&#xff0c;本节内容是关于前端项目的流水化部署发布&#xff0c;通过实操发布一个前端项目&#xff0c;从而完成前端项目的流水化发布。前端项目主要是静态资源的发布&#xff0c;这里我们以一个vue项目为…

智慧物流信息化供应链管理体系转型发展现状

现如今&#xff0c;伴随着时代的迅速发展和高新科技水准的持续提升&#xff0c;人们慢慢进入了信息时代。在其中&#xff0c;物流制造行业也从以往20年前的粗放型管理机制慢慢变化为信息化、智慧化的管理机制。 5G、云计算技术、AI、物联网等新技术的出现加快了各个领域经营方法…