反射 动态代理 线程池

2023-10-27

反射 动态代理 线程池

反射 动态获取类的字节码文件,并对其进行抽象

通过反射可以获取一个类的全部方法和属性,然后进行调用。

反射与类之间抽象的理解:Class 将字节码对象进行抽象 出现了:

1.属性:表示字节码文件的属性的属性:private Field field;
2.属性:表示字节码文件的普通方法的属性:private Mathod method;
3.属性:表示字节码文件的构造方法:private Constructor con;

[外链图片转存失败(img-NYdDgqXU-1568049804584)(imgss\cc.png)]

字节码文件之间可以越过new 创建对象

注意:Class的父类是Object

  • 通过反射创建对象?
    1.获取字节码文件对象
    2.通过字节码文件对象获取对应的实例对象
    3.给属性赋值
    4.调用方法

步骤:

1.获取字节码文件对象

1.类对象:getClass();//这里的对象也是new出来的,不适合
2.Person.class;?
3.Class.forName("包名加类名");//先比2更灵活不需要知道类名

2.通过字节码文件对象获取对应的实例对象

1.普通的方式:Person person = new Person()
2.通过反射创建
    - 无参:字节码文件对象调用newInstance();//newInstance()方法内部调用了无参构造
    - 有参:先拿到构造方法的对象
        Constructor constructor = cls.getConstructor(String.class,int.class);//参数是可变的。在字节码文件中穿的是字节码文件类型,而name和age是值
        object = constructor.newInstance("bingbing",18);

3.给属性赋值

1.name是public
    Field field1 = class.getField("name");  
2.name是private
    //给对象给属性赋值
    Field field =class1.getDeclaredField("name");
    field1.set(object, "bing");
    // 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
    field.setAccessible(true);
    //赋值
    field1.set(object, "bing");

4.调用方法非静态
调用非静态无参:
//通过字节码文件得到反射方法
Method method = cla.getMethod(“show”);
//调用方法,通过调用invoke方法实现
method.invoke(object);

    调用非静态有参
        //先得到有参的构造方法
        Constructor<?> constructor = cla.getConstructor(String.class,int.class);
        Object object = constructor.newInstance("bingibn",10);
        //通过反射得到方法
        Method method = cla.getMethod("callPhone",String.class);
        //调用方法,通过调用invoke方法实现
        method.invoke(object,"110");

5.调用方法静态

    调用静态有参:

    //通过反射得到方法:Method method = cla.getMethod("run",int.class);
    //调用方法
    method.invoke(null,11);

动态代理 (设计模式)

静态代理

1.作用:根据OCP(对扩展开发,对修改关闭)的原则,在不改变原来类的基础上,给这个类增加新的功能
2.缺点:代理对象要保证和目标对象实现同样的功能,在维护的收两个对象都要维护,而且代理对象实现的接口是死的。这时如果要给想实现不同功能的多个目标对象添加代理对象的话,要添加很多个类

动态代理:在程序运行时运用反射机制动态创建而成

动态生成代理对象的方法–通过JDK内置的java.lang.reflect.Proxy动态代理类完成代理对象的创建

1.参数一:这里代表类加载器,代理类的类加载器要与目标类的类加载器一致,类加载器用来装载内存中的字节码文件
2.参数二:代理类于目标类实现的接口必须是相同的,即指定给代理类的接口,目标必须实现了
3.参数三:代理类的类构造器生成的对象–注意:指定给构造方法的参数要使用Object

TestInter object = (TestEat)Proxy.newProxyInstance(testEat.getClass().getClassLoader(),new Class[]{TestIner.class},new Agent(testIner));

工厂类:


//创建一个工厂类---用于创建代理对象
public class TestFactory {
	//工厂方法
	public static TestInter getAgentFactory( final TestInter test) {
  //final TestInter test = new Bingbing();
		
		return (TestInter)Proxy.newProxyInstance(test.getClass().getClassLoader(), new Class[]{TestInter.class}, new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// TODO Auto-generated method stub
				System.out.println("扣一半房租做中介费");
				// TODO Auto-generated method stub
				//通过反射的方法调用具体对象的方法
				Object object = method.invoke(test, args);
				
				System.out.println("哈哈大笑");
				
				return object;
			}
		});
	
	}

}

线程池

  • 在线程池里面有
创建线程池–Executors

1.newCachdThreadPool创建一个可缓存线程池,如果线程池的长度超过处理需要,可灵活回收线程,若无可回收,则新建线程
2.newFiledThreadPool创建一个定长线程池,可控制最大并发数,超过的线程会在队列中等待
3.newScheduledThreadPool创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO LIFO)

收,则新建线程
2.newFiledThreadPool创建一个定长线程池,可控制最大并发数,超过的线程会在队列中等待
3.newScheduledThreadPool创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO LIFO)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反射 动态代理 线程池 的相关文章

  • 上传进度条 Java Servlet?

    我想使用 servlet 显示上传进度条 我尝试过Ajax iFrame 技术 页面没有重新加载 文件也被上传 但是 进度条没有出现 有没有可用于 javaservlts 的 jQuery 进度插件 Thanks 我强烈推荐jQuery 上
  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static

随机推荐

  • 苹果Vision Pro手势+眼球融合交互的奥秘

    毫无疑问 Vision Pro在眼球追踪 手势的融合交互体验上 给AR VR头戴设备带来了新突破 在用户体验上的提升非常明显 那么 为什么Vision Pro上这一功能会被如此值得关注呢 为了弄清楚 我们先来看看主流VR设备是如何做的 主流
  • Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding

    Fatal Python error init fs encoding failed to get the Python codec of the filesystem encoding Python runtime state core
  • 循迹小车代码应该怎么写?

    循迹小车的代码通常包括以下几个部分 引入库和定义变量 首先需要引入所需的库 并定义各个引脚对应的变量 以便后面的代码可以直接使用 初始化设置 对循迹小车进行初始化设置 如设置电机转向 速度等参数 读取循迹传感器数值 通过循迹传感器读取黑线和
  • 用jQuery编写简单的动画效果

    jQuery是一种基于JavaScript库的快速 小型而且特别丰富的JavaScript库 它极大地简化了HTML文档遍历和操作 事件处理 动画效果和AJAX交互等功能 jQuery中的各种动画函数可以让我们轻松地为网页添加各种各样的动画
  • Leetcode 刷题笔记:字符串篇

    结束了忙碌的期末 终于有了一个月的冬假 赶紧利用这段时间集中精力把Leetcode刷起来 1 Leetcode344 反转字符串 题解 难度 这道题目算是比较基础也是很简单的一道题目了 用双指针的方法可以轻松解决 时间复杂度O N 空间复杂
  • ES集成IK分词器

    一 下载IK分词器 注意版本与ES版本保持一致 下载地址 https github com medcl elasticsearch analysis ik releases 二 下载之后解压到ES的plugin目录 注意新建一个ik目录 解
  • 运行jar包时指定jdk的版本

    set JAVA HOME C Program Files Java jdk1 8 0 153 set CLASSPATH JAVA HOME lib dt jar JAVA HOMe lib tools jar set Path JAVA
  • CryptoPP版本验证

    在使用第三方程序库时 可能会遇到程序库的版本不匹配的问题 下面介绍在使用CryptoPP时 如何验证其版本 代码如下 include
  • 字符串转换成整数

    题目描述 输入一个由数字组成的字符串 把它转换成整数并输出 例如 输入字符串 123 输出整数123 给定函数原型int StrToInt const char str 实现字符串转换成整数的功能 不能使用库函数atoi 分析与解法 本题考
  • 问题:WPS文字提示应用程序已存在该快捷键,请另设快捷键

    1 问题描述 WPS文字 对某一字体样式自定义快捷键 结果提示已存在 如何如何查看已设定快捷键 只针对软件内部冲突 不考虑外部软件影响 我遇到过以下两种情况 1 与自己之前定义的冲突 2 与模板文件冲突 这个不太确定 对于模板冲突 自定义样
  • sqlite的下载安装和配置使用(非常详细)

    sqlite下载链接 Sqlite下载官网 1 这个压缩包中有头文件sqlite3 h以及源码 主要是用到头文件 2 看电脑配置的操作系统或者看所需项目是64位还是32位下载对应的压缩包 3 解压得到这两个文件 sqlite3 def文件用
  • TCP三次握手原理,以及为什么不能改成两次握手

    网上 关于 TCP三次握手 的文章有很多 但很多一些部分讲的含糊其辞 所以才重新造了这个轮子 一方面对那些含糊其辞的部分做了解释 另一方面也方便了以后的学习 1 上图的名词解释 SYN 同步序号 它表示建立连接 TCP规定SYN 1时不能携
  • uniapp如何渲染html模板,uni-app 页面样式

    页面样式与布局 尺寸单位 uni app 支持的通用 css 单位包括 px rpxpx 即屏幕像素 rpx 即响应式px 一种根据屏幕宽度自适应的动态单位 以750宽的屏幕为基准 750rpx恰好为屏幕宽度 屏幕变宽 rpx 实际显示效果
  • B站视频下载(含bv快速变回av)

    下载解压JJDown的软件 打开如下应用程序 JiJiDownForWPF打开首页 原本B站中的每个视频有对应的av号但从2020 3起全都变为bv号 所以如何从bv号中查看av号 谷歌浏览器中打开要下载的B站视频 按F12 开发者工具 选
  • Python#Typora-Python笔记

    01 源码安装Python3 一 源码安装 安装依赖软件包 root qfedu com yum groupinstall Development Tools root qfedu com yum y install zlib devel
  • 日语动词的13种变形

    五段动词 一类动词 辞书形 形 形 形 形 意志形 可能形 行 行 行 行 行 行 行 書 書 書 書 書 書 書 買 買 買 買 買 買 買 假定形 被动形 使役形 命令形 禁止形 被役形 行 行 行 行 行 行 書 書 書 書 書 書
  • 【linux】内核组件 [不断补充中...]

    防火墙 netfilter iptables IP 信息包过滤系统 netfilter 内核空间 kernelspace 是内核的一部分 由一些信息包过滤表组成 这些表包含内核用来控制信息包过滤处理的规则集 即 存放内核过滤规则的防火墙 i
  • GridView 使用方法详解

    GridView 跟ListView 很类似 Listview 主要以列表形式显示数据 GridView 则是以网格形式显示数据 掌握ListView 使用方法后 会很轻松的掌握GridView的使用方法 欢迎关注微信公众号 程序员Andr
  • DBeaver导入csv数据到Oracle

    时隔许久 我又回来写博客啦 前段时间太忙了 绝对不是因为懒才没有写的 大实话 今天用到csv存库的问题 踩了点坑 做个笔记 废话不多说我们开始 第一步 打开DBeaver 右键点击要导入数据的表 选择 导入数据 第二步 点击csv 下一步
  • 反射 动态代理 线程池

    反射 动态代理 线程池 反射 动态获取类的字节码文件 并对其进行抽象 通过反射可以获取一个类的全部方法和属性 然后进行调用 反射与类之间抽象的理解 Class 将字节码对象进行抽象 出现了 1 属性 表示字节码文件的属性的属性 privat