java反射与newInstance

Java:源码分析—反射(实例化对象:newInstance) 今天我们来通过源代码,看看Java中反射是如何工作的。 反射,其实在我们日常的编程过程中可能用的并不多,但是第三方的库,这个技术确实应用非常广泛的,包括我们在开发Android应用时,有时为了操作一些不开放的系统属性时,也会用到反射。 这里我们将通过分析反射的运行,来看看Class这个类的功能。开始之前,先提到两个静态的整型变量,在java.lang.reflect.Member中。这两个变量... 阅读详情

今天看了工厂模式,里面有关于通过反射机制来创建对象。我目前为止我的理解是这样的(以下只是个人理解,不对之处请拍砖哈~):

(1)通过Class的静态方法Class.forName(String classpath)将.class文件加载到虚拟机中,所谓加载实际上做的事情包括:1)为静态变量分配空间并初始化。2)执行静态块代码。3)生成类对象,即Class类的对象,该对象描述了被加载类的信息。

   可以对该生成的类对象进行相关的操作,如得到对象的名称,得到静态方法并执行。

(2)通过类对象的不同构造器,生成相应的对象,并调用方法。


对new 和instance区别的理解:

new:强类型,高效率

instance:弱类型,低效率

· 通过new进行对象生成时,实际上在程序代码中已经默认知道了类的名称信息,因此二者存在某种耦合。而instance生成对象的方法将待生成对象的信息通过字符串作为参数传输,代码本身并没有生成类进行关联,因此实现了解耦。

· new一次性实现了类的加载,类的实例;而instance将这两个过程分开,可以对类对象进行控制。当然通过new生成对象后可以通过对象getClass方法得到对象的类对象。


我写的测试代码如下:

package com.ht.test;

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

public class Test {

    private int i = 10;

    private static int j = 5;

    static {
        System.out.println("j = " + j);

        System.out.println("this is static section");
    }

    public Test() {
        i = 20;
    }

    public Test(int val) {
        this.i = val;
    }

    public Test(int a, int b) {
        this.i = a + b;
    }

    public void print() {
        System.out.println("i="+i);
    }

    public static int getJ() {
        return j;
    }

    public static int getJ(int i) {
        return j * i;
    }

    /**
     * @param args
     * @throws ClassNotFoundException
     * @throws SecurityException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

        //1.加载.class文件,生成类对象
        Class cls = Class.forName("com.ht.test.Test");
        System.out.println(cls.getName()+"类加载完毕");

        System.out.println("-----------操 作 类 对 象 方 法-----------");
        //2.1根据类对象调用静态方法getJ()方法
        Method m1 = cls.getMethod("getJ", null);
        Object ret1 = m1.invoke(new Test(), null);
        System.out.println("2.1:"+ret1.toString());
        
        //2.2根据类对象调用静态方法getJ(int)重载方法
        Method m2 = cls.getMethod("getJ", Integer.TYPE);
        Object ret2 = m2.invoke(new Test(), new Integer(9));
        System.out.println("2.2:"+ret2.toString());
        
        Method m3 = cls.getMethod("print", null);
        m3.invoke(new Test(), null);

        
        System.out.println("-----------根据类对象构造器构造对象-----------");
        //3.根据类对象得到不同的构造函数,并分别构造不同的对象
        //3.1 无参构造
        Constructor cons[] = cls.getConstructors();
        for (int i = 0; i < cons.length; i++) {
            try {
                Test t = (Test) cons[i].newInstance(new Object[]{});
                t.print();
                t.getClass();
                break;
            } catch (Exception e) {
                //e.printStackTrace();
            }
            
        }
        
        //3.2 单参数构造
        for (int i = 0; i < cons.length; i++) {
            try {
                Test t = (Test) cons[i].newInstance(new Object[] { 77 });
                t.print();
                break;
            } catch (Exception e) {
                //e.printStackTrace();
            }        
        }
        
        //3.3 2个参数构造
        for (int i = 0; i < cons.length; i++) {
            try {
                Test t = (Test) cons[i].newInstance(new Object[] { 33, 66 });
                t.print();
                break;
            } catch (Exception e) {
                //e.printStackTrace();
            }        
        }

    }

}


运行结果如下:

j = 5
this is static section
com.ht.test.Test类加载完毕
-----------操 作 类 对 象 方 法-----------
2.1:5
2.2:45
i=20
-----------根据类对象构造器构造对象-----------
i=20
i=77
i=99




【高级-RAG-优化方法】 本文介绍了两种优化RAG(检索增强生成)系统的高级方法。第一部分介绍KnowFlow项目,它采用父子分块技术,将文档分为父分块(800-1500字符)和子分块(200-400字符),通过精确匹配子分块再返回父分块内容来保证搜索精确性和上下文完整性。第二部分探讨Milvus的多种增强技术,包括查询增强(如假设问题生成、回溯提示)、索引增强(自动合并块、分层索引)、检索器增强(句子窗口检索、元数据过滤)、生成器增强(提示压缩、块排序)以及管道增强(自我反省、代理查询路由)。这些方法共同提升了RAG系统的检索效率 阅读详情

相关推荐

基于Matlab的MIMO通信系统仿真_Simulink实现

瑞利衰落信道中使用空时分组码的BPSK调制的BER 1、2发1收 参数设置: 双极性信号元+1和-1,每符号含1bit; 采样时间=符号时间=1s; 采用基于数据帧的仿真计算模式,每帧中有2个采样值; 仿真时间=出现100个误码后停止仿真; 随机整数种子=22; Jakes衰落模型中每个信道上的多普勒频移=0.01Hz; 输人信号功率=2W; Alamouti码:两根发送天线,一根接收天线(分集阶= 2); 平均信道信噪比= 18dB; 仿真得出的误码率统计BER =0. 00017. 2、2发

太阳帅帅的博客 9688

Java中使用反射调用静态方法

在新建一个Fragment的时候,需要调用newInstance()静态方法。 想用反射来简化相关的代码: Method newInstanceMethod = clazz.getDeclaredMethod("newInstance");; Fragment fragment = (Fragment) newInstanceMethod.invoke(null); 注意:一般的方法

zhuhai__yizhi的专栏 6961

Android Studio中把llama.cpp编译Android .so

本文介绍了一个在Android Studio中集成llama.cpp的最小Demo实现方案,通过JNI将llama.cpp编译为Android.so库,实现本地加载GGUF模型进行文本生成。文章详细说明了项目结构配置(SDK≥30,NDK≥28)、CMake编译设置、Kotlin-JNI-C++的完整调用链实现,以及模型文件部署方式。该Demo采用每次请求新建上下文的简化设计,包含加载模型、生成文本、资源释放等核心功能,并提供了错误排查建议。项目舍弃了上下文保持等复杂功能以确保稳定性,适合作为端侧大语言模型

Zhang Phil 516

Java类的加载和反射机制

1.类加载机制的原理: 启动JVM 将需要运行的class文件加载到虚拟机内存中 找到主类,开始执行主函数 加载步骤: 1.先委托父类加载类,如果父类已经加载,就不需要再次加载,如果父类没有加载,再由本加载器加载 2.解析类路径,将类路径转换成文件路径 3.通过文件输入流来读取class文件,得到字节数组 4.将字节数组转换成类对象,对象的类型是Class类型 2.有哪些类加载器: 扩展类加载器(extensions class loader):它用来加载Java的扩展库 应用类加载器:( AppCl

qq_45942412的博客 243

Nvidia AGX Xavier刷机指北

因为工作的关系,要在AGX上安装CUDA。nvidia官网上没找到适合AGX版本的CUDA,只能走刷机的路子。刷机过程中,也遇到一些坑,做个记录。 需要有一台ubuntu系统的电脑作为主机Host。我的主机系统为Ubuntu18.04 整个刷机过程为: 在Host上安装sdkmanager,整个刷机过程主要通过sdkmanager来操作。 在Host自动下载一些系统组件,各种deb包 Host上制作OS系统镜像,烧录到AGX中 Host上之前下载好的deb包,安装到AGX中。 完结,撒花 ...

sinat_38685124的博客 6294

机器人路径规划:基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的机器人路径规划(提供MATLAB代码)

移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或局部已知的局部路径规划。随着科技的快速发展以及机器人的大量应用,人们对机器人的要求也越来越高,尤其表现在对机器人的智能化方面的要求,而机器人自主路径规划是实现机器人智能化的重要步骤,路径规划是指规划机器人从起点位置出发,无碰撞、安全到达指定目标位置的最优路径。

IT猿手 1367

java 高级泛型_java之旅_高级教程_java泛型

摘自:http://www.runoob.com/java/java-generics.htmlJAVA泛型java泛型(generics)是JDK5中引入的新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组、甚至其他任何类型的数组进行...

weixin_33640562的博客 235

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

本文使用OpenCV C++ 实现基于轮廓比对的缺陷检测。

Zero___Chen的博客 1148

error和exception

Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。Exception又分为运行时异常,...

weixin_30954265的博客 227

OsgEarth —— 笔记6 - 开发阶段加入漫游飞行(附源码)

效果      视频地址   源码 源码下载请私信   代码      代码相关内容:           OSG —— 笔记1 - 指令调用模型           OsgEarth —— 笔记1 - 创建地球的earth文件           OsgEarth —— 笔记2 - Qt窗口加载earth地球(附源码)           OsgEarth —— 笔记3 - 为地

1896

SAP_SD模块_SAP 消息号VF501(科目确定期间出错)

摘要: SAP SD模块中执行VF02销售开票时出现“科目确定期间出错”(VF501)问题,主要原因是系统无法找到匹配的总账科目。解决方案包括:检查物料主数据和客户主数据中的科目分配组是否维护,核对发票中的对应字段,并通过VKOA事务代码分析科目确定逻辑。若定价过程中配置的科目代码(如Z01)未在VKOA中完整映射(如缺少H1+S5+Z01组合),则会导致内部价格无法关联总账科目。需在SPRO路径下完善科目代码分配配置,确保定价类型与科目代码匹配。本文提供了详细的排查步骤和配置方法,帮助解决开票过账错误。

我小时候很黑的博客 354

java反射与new_java反射对象和new出来的对象有什么区别

一、**********************************************************************a1:new属于静态编译b1:反射属于动态编译,意思就说只有到运行时才会去获得该对象的实例,大多框架都是使用反射获取对象实例,如Spring二、********************************************************...

weixin_39990558的博客 365

YOLOv11改进 | 网络结构代码逐行解析(一) | 项目目录构造分析

Hello,大家好这次给大家带来的不是改进,是整个YOLOv11项目的分析整个系列大概会更新5-7篇左右的文章从项目的目录到每一个功能代码的都会进行详细的讲解,下面开始进行YOLOv11逐行解析的第一篇——项目目录构造分析开头之前顺便给大家推荐一下我的专栏,本专栏更新上百余篇YOLOv11改进机制手把手教你添加到网络结构中,同时针对拿到模型不知道如何修改,不知道如何发表论文的读者进行针对性的文章介绍,本专栏质量分平均分96分,内容质量完全有所保证。

Snu77的博客 1万+

newinstance()方法_Java:反射(newInstance)源码分析

Java:源码分析—反射(实例化对象:newInstance)今天我们来通过源代码,看看Java中反射是如何工作的。反射,其实在我们日常的编程过程中可能用的并不多,但是第三方的库,这个技术确实应用非常广泛的,包括我们在开发Android应用时,有时为了操作一些不开放的系统属性时,也会用到反射。这里我们将通过分析反射的运行,来看看Class这个类的功能。开始之前,先提到两个静态的整型变量,在java...

weixin_39683858的博客 1580

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java反射之Constructor、getDeclaredConstructor与newInstance

getDeclaredConstructor 是 Java 反射 API 提供的一个方法,用于获取指定类中声明的构造方法。与 getConstructor 不同的是,getDeclaredConstructor 可以获取到所有访问级别(public、protected、default、private)的构造方法,而 getConstructor 仅能获取到 public 访问级别的构造方法。该方法有一个参数,即参数列表类型。可以利用该参数获取到特定参数类型的构造方法。

weixin_49116772的博客 3599

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java反射newinstance_Java Constructor newInstance()方法

Java Constructor newInstance()方法java.lang.reflect.Constructor.newInstance(Object ... initargs)方法使用此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。个别参数自动展开以匹配原始形式参数,原始参考参数和参考参数都需要进行方法调用转换。1 语法publi...

weixin_31301881的博客 1195

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

newInstance()方法是Java反射API中的一个重要方法

用于动态地创建一个类的实例(对象)‌。这个方法属于java.lang.reflect.Class类,当需要动态创建类的实例时,可以使用newInstance()方法。需要注意的是,从Java 9开始,newInstance()方法已被标记为过时(deprecated),因为它可能抛出异常,更好的替代方法是使用Class.getDeclaredConstructor().newInstance()。

weixin_43347149的博客 525

java反射newinstance_java反射

Class.forname("className").newInstance();和new的区别平时开发中我们经常会发现:用到Class.forName()方法。为什么要用呢? 下面分析一下:主要功能Class.forName(xxx.xx.xx)返回的是一个类Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段在初始化一个类,...

weixin_39628343的博客 412

JAVA——如何理解反射中的 newInstance 方法?

首先,什么是反射? 概念:动态获取或者动态调用对象的方法 的功能我们称之为java语言的反射机制. 为什么要用.class ? 举例:比如一只野外大象死亡。我们想要解剖它,查看大象的死因,以及其它属性(年龄、性别、心、肺、肝脏......) 因为大象已经死亡,所以我们肉眼无法得知其体内“属性”,故而引入“反射”技术得到大象的信息。 ...

东城庞太师 1万+

【Java笔记(7)】反射实例化对象clazz.getDeclaredConstructor().newInstance()跟class.newInstance()

目录一、Class类的实例化方式二、反射实例化对象三、关键字总结 一、Class类的实例化方式 package reflect; import java.util.Date; /** * Class类对象的三种形式,三种形式都很重要 * * @ClassName: ClassObjectThreeDome * @Author: Xlu103 * @Date: 2020-06-07 19:14 **/ public class ClassObjectThreeDome { //注意会抛出

weixin_43493559的博客 4373

java class反射与new_通过Class.newInstance()和Constructor.newInstance()两种反射方法创建对象的异同...

首先两种方式在源码里所在的位置:Class.newInstance() → Inside java.lang 包Constructor.newInstance() → Inside java.lang.reflect 包使用方法:Class.newInstance():Class.forName("HelloWorld").newInstance();或者HelloWorld.clas...

weixin_33087827的博客 1872

Java反射笔记之 newInstance已过时, 被@Deprecated

class.newInstance()在java9时被@Deprecated 今天在用jdk17的反射时, 发现神器newInstance()竟然已过时, 被@Deprecated了 查看源码: @SuppressWarnings("removal") @CallerSensitive @Deprecated(since="9") public T newInstance() throws InstantiationException, IllegalAcce

kfepiza的博客 4360

java 反射constructor_构造方法的反射应用constructor方法newInstance(Obeject...initargs)功能...

Constructor类代表某个类中的一个构造方法得到某个类所有的构造方法:Constructor[]constructors=Class.forName("java.lang.String").getConstructs();得到某个类的某个构造方法Constructorconstructor=Class.forName("java.lang.String").getConstructor(St...

weixin_29731583的博客 643

java 反射机制 之 newInstance 执行无参数构造函数

java 反射机制 之 newInstance 执行无参数构造函数

不废话快上车 4677

java反射newinstance_Java反射:new一个宝可梦吧

最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非。其实这种写法是Java反射相关的知识,于是动手总结一下常用的反射使用方式。假设极客君编写了一个口袋妖怪接口,如下所示:package com.cdcgeek.bean;/*** 口袋妖怪接口定义*/public i...

weixin_35589806的博客 383

java反射技术中的newInstance方法的使用

Class.forName(className).newInstance() 需要类有一个默认的构造方法 转载于:https://www.cnblogs.com/xzf007/archive/2012/08/14/2873851.html

SYL269794967的博客 386
上一篇: java线程安全-通俗易懂的讲解
下一篇: oracle监听器配置
「已注销」
博客等级 码龄18年 5粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值