Java的Reflection和后绑定

如何在离线的电脑上部署一个本地Deepseek(使用ollama) 例如,如果您的显卡显存为 16GB,官方推荐使用 32b 大小的 DeepSeek 模型。请根据您的硬件配置选择适合的模型版本,以获得最佳性能。首先我们需要将ollama和chatbox的安装包,Deepseek模型文件通过U盘或者光盘的形式导入到这台不能联网的电脑上。按照时间排序,找到最大的那个文件,就是gguf格式的模型,复制出来,改名为qwen2.5-coder0.5b.gguf。:基于开源模型(如 QWEN 和 LLAMA)微调,参数量从 1.5B 到 70B 不等,适合本地硬件部署。 阅读详情
     这个主题本身是一个比较advanced的话题,这里只谈一下我的粗浅理解,还请各位能补充。
    
     绑定是指将方法和调用方法的对象(或类)绑定,而后绑定是指绑定发生在运行时刻而非编译时刻。事实上,大多术面向过程的语言,比如c只支持前绑定,即绑定发生在编译时。
     我们先来举一个例子:
     interface Fly {
           public void fly();
     }
     class bird implements Fly{
           public void fly(){
                 System.out.println("bird fly!");
           }
     }
     class plane implements fly{
           public void fly(){
                 System.out.println("plane fly!");
           }
     }
     class FlyFactory {
            private static FlyFactory myself; 
            private FlyFactory();
            public Fly getFly(){
                 return new bird();
            }
            public Fly getAnotherFly(){
                 return new plane();
            }
            public static getInstance(){
                 if (myself == nul){
                       myself = new FlyFactory();
                 }
                 return myself
            }l
     }
     public class Binding {
           public static void main(String[] args){
                 Fly FirstFly =  FlyFactory.getInstance().getFly();
                 Fly SecondFly = FlyFactory.getInstance().getAnotherFly();
                 FirstFly.fly();
                 SecondFly.fly();
            }
     } 
     很明显,main跑起来后显示的是
     bird fly!
     plane fly!
     有些人就会问了,申明的都是Fly接口,那么虚拟机究竟是怎么知道实际调用的到底是哪个实现呢?  这就是后绑定!完全在运行时刻和具体的实例绑定!(上述采用了factory method这种设计模式,而FlyFactory本身又采用了singleton模式,有兴趣的人可以琢磨一下) 
     实现后绑定的技术称作RTTI(run-time type identification)运行时类型检查。Java 的RTTI有三种:
     一种是在形式上是传统的所谓强制类型转换,即在实例之前加上想要转换的类型并用括号括起来。这在c/c++里面很常见,但是c/c++这种形式是不采用RTTI形式的,所以称为“强制”!即不做类型检查,所以是不安全的类型转换,即你永远无法预计会产生什么结果。但是java将这种形式做了RTTI检查,即如果在运行时发现类型转换出错,会抛出ClassCastException,所以是类型安全的!
      一种就是Reflection(反射),以下会重点介绍,因为反射使后绑定完全成为运行时的工作了,是实现多态的坚固的技术后盾。
      最后是instance of 操作符,在这篇日志中就不做介绍了。
      现在就让我们来谈谈反射,事实上上述的例子用的就是反射,通过反射来具体知道方法究竟是属于哪一个实例的!也许你已经想到,想要完全在运行时刻(即在代码里完全不做类型转换的显示申明)jvm必须得到额外的关于这个实例的类型信息,或者称为元数据 (meta data)。
      这个类型信息就是隐藏在每个类里面的class成员变量。这个变量并不是你自己加在代码里的而是java自动帮你加入的。拿上述的Fly接口来说他就有一个class成员变量,而这个成员变量提供许多得到该类类型信息的方法,包括他是不是个接口,他的父类,他的方法等等。而对于实例你可以调用getClass()方法得到这个class变量。因此jvm就是查看每个实例和类里的这个class成员变量的一些信息来进行后绑定的!
      最后介绍反射的另一个用法。有jdbc开发基础的人都对这个方法很熟悉class.forName(),参数往往是驱动名称(即带包结构的类名)。class.forName就是利用反射技术告诉ClassLoader去动态加载参数所表示的那个类!注意只是加载,如果你还要得到实例的话那么必须调用class.forName(ClassName).newInstance()前提是该类有无参数的构造函数!也许你要问为什么要这样做,直接申明一个实例不是更好吗?我之前的那篇谈接口和抽象类的日志里提到过可插拔的技术。可插拔就是脱离硬编码(hard coding)完全能在不重新编译代码的情况下,换一个实现。而反射就是实现这种方式的技术后盾。我可以把要用的实现的类名放在一个配置文件中,然后去读这个配置文件,那在程序中,内容肯定是放在一个输入流中,假设叫in,那么你就可以通过调用class.forName(in.toString()).newInstance()来产生实例,而完全不用管留里面究竟是什么了,这通过常规的生成实例是不可能完成的,因为常规的方法需要知道类名,换类名就要改代码,这就变成了硬编码了。但是通过反射,我只需要换那个配置文件,而把程序重启以下就行了!
      以上就是我个人对反射和后绑定的理解,希望大家能够补充,另外这篇日志的代码实例所采用的两种设计模式,需要的人可以参看一下!
 
单细胞数据互转实战:从Scanpy的h5ad到Seurat对象的四种高效方法 本文针对单细胞数据分析中Scanpy的h5ad格式与Seurat对象互转的常见难题,详细对比了SeuratDisk、anndataR、schard和sceasy四种高效转换方法。文章从实战出发,剖析了每种方法的原理、操作流程、优缺点及避坑指南,并提供了清晰的选型策略,帮助用户根据数据特点选择最佳方案,实现跨平台数据的无缝衔接。 阅读详情

相关推荐

西门子S7-1200的PID应用(恒温热水器)

物料清单:1200PLC一台,模拟量输入模块SM1231(PLC自带的输入通道不支持4-20mA电流输入)一个,PT100一个,温度变送器,热得快,固态继电器。 第一步,硬件接线; 第二步,新建1200工程,添加PLC和模拟量输入模块,修改模块的模拟量输入类型为4-20mA,模拟量模块的IO地址为96-103(8个字); 第三步,新建循环组织块OB30,循环时间选择默认点1...

weixin_30835649的博客 6551

Java之动态绑定

        所谓动态绑定,通俗的是指,对象在调用方法的时候能够自己判断该调用谁的方法。所以动态绑定一般发生在继承、方法重载时。         那么发生方法重载时,编译器如何确定调用的方法呢,例如,调用c.f(arg)时,首先需要将c声明为B类的对象,此时,如果在B类中,存在多个f方法,只是f的参数类型不同,调用f(int)或者f(String)时。编译器会注意列举B类中所有名为f的方法以及...

卑鄙的我 5405

【Codesys】获取从站信息,判断是否从站断联,总线丢失

获取EtherCAT从站信息,判断是否从站断联,总线丢失

qq_35316470的博客 5733

java利用反射动态加载方法

@参考文章 根据特定字符串加载相应的方法,有人用if else,有人用switch。参数少了或情况少了还好,很多方法真要命,不要紧,java反射拯救你 import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws Exception { ...

weixin_33681778的博客 558

告别第三方插件:官方Fused Library如何重塑Android库的合并与发布流程

本文详细介绍了Android官方推出的Fused Library如何替代第三方fat-aar插件,优化Android库的合并与发布流程。通过原生支持、智能依赖管理等优势,Fused Library解决了版本兼容性、依赖传递等核心痛点,提供了更稳定高效的开发体验。文章还提供了迁移实操指南和工程实践建议,帮助开发者顺利过渡到官方方案。

weixin_42561040的博客 259

ADB详细(从下载安装到灵活运用)

ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载ADB Kits。

LiuYong_01的博客 10万+

java reflection,java 反射,动态绑定

java reflection,java 反射,动态绑定                                       Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。 Java 的这一能力在实际应用中也许

190

FPGA控制DDR读写(AXI4总线接口)

FPGA控制DDR读写

qq_42712308的博客 1万+

java reflection Java 反射,动态绑定

java reflection,java 反射,动态绑定                                         Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。Java 的这一能力在实际应用中也许用得不是...

zhou363667565的专栏 193

从零到一:Gromacs伞形采样的实战避坑指南

本文详细介绍了Gromacs伞形采样技术的实战应用与避坑指南,涵盖核心原理、环境准备、参数设置、数据分析及性能优化等关键环节。特别针对蛋白质-配体结合自由能计算等典型应用场景,提供了弹簧常数设置、采样窗口间距等实用参数建议,帮助研究人员高效完成分子动力学模拟。

weixin_29243279的博客 516

2026年紫光同创数字IC笔试试卷带答案

FPGA基础知识与设计要点摘要 本文围绕FPGA与数字IC设计核心概念,通过单选题、波形分析题、多选题和简答题形式,系统梳理了以下关键知识点: FPGA基础架构 查找表(LUT)是实现组合逻辑的基本单元(题1) CLB包含LUT、触发器和进位链,后者加速算术运算(题6,10) 布局布线优化是减少关键路径延迟的核心方法(题7) 时序分析要点 建立时间(时钟沿前数据需稳定)与保持时间(时钟沿后需保持)的定义(题2,简答1) 亚稳态成因及两级同步器处理跨时钟域信号的方法(多选题1,波形题5) 特殊设计技术 异步复

Open 117

REFLECTION(反射)INTROSPECTION(内省、内观)

有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。 一般而言,开发者社群说到动态语言,大致认...

ainie4139的博客 1985

Android 车载开发深度解析:CarPropertyManager 核心机制与实践指南

摘要: Android Automotive OS中,CarPropertyManager作为车载信息娱乐系统的核心组件,连接应用层与车辆硬件(如车速、油量等),其架构基于分层设计(App→CarAPI→VHAL→ECU),采用发布-订阅模式实现高效数据通信。通过HIDL/AIDL跨进程交互及共享内存优化,延迟可降至2ms以下。安全机制包括分级权限控制(VISIBLE/PROTECTED/SYSTEM_RESTRICTED)和HMAC防篡改。开发时需注意监听器生命周期管理、事件合并降负载及低功耗适配。

郑伟强dev的专栏 344

517. Java 方法句柄 - 方法句柄 vs 反射 API

<think>我们根据用户指令,需要从给定内容生成≤150字的文章摘要。内容是关于Java方法句柄与反射API的对比。摘要应简洁概括核心要点。注意字数限制。我们可以从背景、差异、互操作、总结中提炼。确保中文,150字以内。</think>Java方法句柄(Method Handles)与反射API定位不同:反射擅长运行时枚举类结构,适合框架扫描;方法句柄提供高性能调用,支持函数式变换,但无法枚举成员。反射每次调用有安全检查,方法句柄仅创建时检查,性能更优。二者可互转,但变换后的句柄无法还原为反射。最佳实践:

yaoxin521123的博客 325

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

反射Reflection

我自己之前学习过深度学习相关内容,使用mmdetection时就感受到了这种感觉,就是一整个模型架构只需要修改配置文件的内容就可以瞬间搭建不同的模型、调整不同的训练策略等。java的反射应该和这个类似。.........

D_Low的博客 374

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

cocos-js在android平台下打开网页

cocos-js在web端打开网页一般用window.location="http://www.bilibili.com" 或者window.open("http://www.bilibili.com"); 但是打包成apk后这句话就不起作用了,所以需要使用jsb绑定通过调用java来访问网页。 引擎自身封装了调用的方法: jsb.jsb.reflection.callStaticMethod

u012897554的博客 2460

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

侯捷谈Java反射机制

摘要Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运

藤蔓植物 431

候捷谈Java反射机制

有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。 一般而言,开发者社群说到动态语言,大...

java交流平台 78

Guava——反射

com.google.common.reflect 包提供了增强版的 Java 反射工具,解决了原生反射 API 在泛型擦除、方法与构造器抽象不统一、动态代理模板代码冗余以及类路径扫描等方面的局限。包核心类一览类名核心职责解决的原生反射痛点运行时捕获、解析与操作完整泛型类型突破泛型擦除限制,准确判断带泛型的继承关系配合进行动态泛型变量替换可以在运行时动态绑定未知的泛型参数类型统一抽象Method与解决方法/构造器无法统一处理及泛型返回值正确解析的问题Parameter封装Invokable。

吴声子夜歌的博客 181

java beans

可序列化:实现接口,以便可以通过 Java 的序列化机制进行持久化。无参构造函数:提供一个无参构造函数,方便通过反射创建实例。属性访问器:通过get和set方法访问和修改属性值。事件监听器:支持事件处理机制,可以通过添加和移除监听器来响应事件。Java Beans 是一个强大的组件模型,提供了属性、事件和方法的支持。通过使用 Java Beans,可以方便地开发可重用的、可配置的组件。虽然 Java Beans 有一些局限性,但它的优势使其在 GUI 开发、数据绑定和企业级应用中得到了广泛应用。

qq_62784677的博客 1135

利用Java的动态代理模式动态加载属性

在我看Stackoverflow的时候,我碰到了这样一个有趣的问题:如何将Java属性文件Properties File绑定到Java接口。这个想法简单却有用! 当我们想在应用中使用常量的时候,我们只需简单地用一下loginConstants.appDescription().我们的应用框架会为这个接口创建一个动态代理。我们所要做的仅仅是调用这个方法,得到默认值或从属性文件中得到值。 基本上是

刘利新西安 1059

Reflection No Reflection 项目教程

Reflection No Reflection 项目教程 1. 项目介绍 Reflection No Reflection 是一个开源项目,旨在创建一个与 Java 核心反射 API 100% 兼容的 API,但完全不使用反射。该项目主要针对 Android 和 Java 平台,旨在通过注解处理和字节码编织技术,提升反射相关库的性能。 项目目标 提供一个不使用反射的反射 API 兼容层。 提升...

gitblog_00624的博客 415

Java反射机制

Java反射机制 关键词: Linux桌面系统10年风雨, 有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动

176

introspection java_REFLECTION(反射)INTROSPECTION(内省、内观)

有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。一般而言,开发者社群说到动态语言,大致认同的一个定义是...

weixin_39535287的博客 243

JAVA反射

Reflection是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可...

ddj0002的博客 109
上一篇: Memento模式,Java和友元
下一篇: EJB学习笔记(1)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值