Java反射小结

vasp算表面吸附流程_VASP表面吸附计算实例分析 本文主要为了记录在学习Vasp计算过程中如何设置INCAR中的一些参数,并不着重讲解其含义,详见可自行到vasp官网查阅。其次关于建模部分也不做细致讨论,一般结构可从Materials Studio里自带的晶体数据库导出,或从三大数据库网站上下载:1、Materaials Project网址:https://materialsproject.org/(强烈推荐,邮箱注册即可使用)2、CCDC网址:... 阅读详情

一、概念

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

二、反射的用途

1)反编译:.class–>.java
2)通过反射机制访问java对象的属性,方法,构造方法等
3)反射最重要的用途就是开发各种通用框架。运行时动态加载需要的加载的对象。

三、反射的优缺点

1)优点:java代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
2)缺点:反射会消耗一定的系统资源;反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

四、反射的具体实现

反射的具体实现包括,获取类的类名、属性、方法、创建对象、获取父类的属性及方法等。

以下是一个实体类Person

package com.ys.reflex;
public class Person {
    //私有属性
    private String name = "Tom";
    //公有属性
    public int age = 18;
    //构造方法
    public Person() {
    }
    //私有方法
    private void say(){
        System.out.println("private say()...");
    }
    //公有方法
    public void work(){
        System.out.println("public work()...");
    }
}

4.1 获取类的属性及方法

首先需要获得这个类的类名,获取类名的方式有三种:

//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
//  类型的对象,而我不知道你具体是什么类,用这种方法
  Person p1 = new Person();
  Class c1 = p1.getClass();

//2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
//  这说明任何一个类都有一个隐含的静态成员变量 class
  Class c2 = Person.class;

//3、通过 Class 对象的 forName() 静态方法来获取,使用包名.类名,用的最多
//但可能抛出 ClassNotFoundException 异常
  Class c3 = Class.forName("com.ys.reflex.Person");

得到类名后,调用Class的API,常见的API如下:

	getName():获得类的完整名字。
  getFields():获得类的public类型的属性。
  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  getMethods():获得类的public类型的方法。
  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  getConstructors():获得类的public类型的构造方法。
  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

调用相应的API即可

//获得类完整的名字
String className = c2.getName();
System.out.println(className);//输出com.ys.reflex.Person

//获得类的public类型的属性。
Field[] fields = c2.getFields();
for(Field field : fields){
   System.out.println(field.getName());//age
}

//获得类的所有属性。包括私有的
Field [] allFields = c2.getDeclaredFields();
for(Field field : allFields){
    System.out.println(field.getName());//name    age
}

//获得类的public类型的方法。这里包括 Object 类的一些方法
Method [] methods = c2.getMethods();
for(Method method : methods){
    System.out.println(method.getName());//work waid equls toString hashCode等
}

//获得类的所有方法。
Method [] allMethods = c2.getDeclaredMethods();
for(Method method : allMethods){
    System.out.println(method.getName());//work say
}

//获得指定的属性
Field f1 = c2.getField("age");
System.out.println(f1);
//获得指定的私有属性
Field f2 = c2.getDeclaredField("name");
//启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
f2.setAccessible(true);
System.out.println(f2);

//获取构造方法
Constructor [] constructors = c2.getConstructors();
for(Constructor constructor : constructors){
    System.out.println(constructor.toString());//public com.ys.reflex.Person()
}

4.2 创建对象

//创建这个类的一个对象
Object p2 =  c2.newInstance();
//将 p2 对象的  f2 属性赋值为 Bob,f2 属性即为 私有属性 name
f2.set(p2,"Bob");
//使用反射机制可以打破封装性,导致了java对象的属性不安全。
System.out.println(f2.get(p2)); //Bob

4.3 获取父类的属性

直接通过反射获取子类的对象是不能得到父类的属性值的,必须根据反射获得的子类 Class 对象在调用 getSuperclass() 方法获取父类对象,然后在通过父类对象去获取父类的属性值。

父类 Parent

public class Parent {
    public String publicField = "parent_publicField";
    protected String protectField = "parent_protectField";
    String defaultField = "parent_defaultField";
    private String privateField = "parent_privateField";

}

子类 Son

public class Son extends Parent {
}

测试类

public class ReflectionTest {

    @Test
    public void testGetParentField() throws Exception{
        Class c1 = Class.forName("com.ys.model.Son");
        //获取父类私有属性值
        System.out.println(getFieldValue(c1.newInstance(),"privateField"));
    }

    public static Field getDeclaredField(Object obj,String fieldName) {
        Field field = null;
        Class c = obj.getClass();
        for(; c != Object.class ; c = c.getSuperclass()){
            try {
                field = c.getDeclaredField(fieldName);
                field.setAccessible(true);
                return field;
            }catch (Exception e){
                //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
                //如果这里的异常打印或者往外抛,则就不会执行c = c.getSuperclass(),最后就不会进入到父类中了
            }
        }
        return null;
    }
    public static Object getFieldValue(Object object,String fieldName) throws Exception{
        Field field = getDeclaredField(object,fieldName);

        return field.get(object);
    }
}

五、反射实践

5.1 从配置文件中调用方法

创建一个简单的类

public class Boy {
    public void play(){
        System.out.println("男孩子喜欢足球");
    }
}

创建一个配置文件(注意路径)

className=reflect.frame01.Boy
methodName=play

测试类

public class FrameTest {
    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties properties = new Properties();
        ClassLoader classLoader = FrameTest.class.getClassLoader();
        //路径,相对于src
        InputStream in = classLoader.getResourceAsStream("reflect/frame01/frame.properties");
        properties.load(in);
        //获取配置文件的属性
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");

        //反射,获取该类
        Class cls = Class.forName(className);
        //创建该类的对象,newInstance被弃用了
        Object obj = cls.getDeclaredConstructor().newInstance();
        //获取该类的方法对象
        Method method = cls.getMethod(methodName);
        //执行方法对象
        method.invoke(obj);
    }
}

执行结果

男孩子喜欢足球

通过修改配置文件,可以调用不同的类的方法。

5.2 调用方法、修改属性

User实体类

package reflect.ex03;

public class User {
    private String name;
    private String sex;
    private int age;

    public User() {
    }

    public User(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void showResult(int res){
        System.out.println("最终计算结果为:"+res);
    }

    private int id(int a,int b){
        System.out.println("调用了私有的id函数");
        return a+b;
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

package reflect.ex03;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception{
        String path = "reflect.ex03.User";
        User user = null;

        //获取反射类
        Class cls = Class.forName(path);
        //调用构造器,自定义对象
        //调用无参构造器,创建默认对象
//        User user = cls.getDeclaredConstructor().newInstance();
        Constructor constructor = cls.getDeclaredConstructor(String.class,String.class,int.class);
        user = (User) constructor.newInstance("Salar","男",26);
        System.out.println(user);
        //修改属性
        Field f1 = cls.getDeclaredField("name");
        f1.setAccessible(true);
        f1.set(user,"MANLAKA");
        System.out.println(user);
        //调用方法,注意指定参数类型,方法有重载
        Method m1 = cls.getDeclaredMethod("id",int.class,int.class);
        m1.setAccessible(true);
        //方法执行结果类型转换
        int res = (int) m1.invoke(user,1,2);
        Method m2 = cls.getDeclaredMethod("showResult", int.class);
        m2.setAccessible(true);
        m2.invoke(user,res);


    }
}

参考资料

https://www.cnblogs.com/ysocean/p/6516248.html
https://blog.youkuaiyun.com/qq_36957885/article/details/89599470

YOLO系列专栏(六):YOLO26热力图可视化 | 解析模型推理逻辑,定位检测关键区域 YOLO26作为新一代目标检测模型,其核心优势是高效的特征提取和精准的目标定位,但模型内部的推理过程的“黑盒”特性,给我们的优化带来了很大困扰:❌ 检测精度低:不知道是模型没学到关键特征,还是特征提取不充分;❌ 出现误检/漏检:无法定位问题根源——是锚框不合适?还是特征图未捕捉到目标?❌ 模型优化盲目:调参、修改网络结构全靠“猜”,缺乏针对性;❌ 难以解释模型行为:实际项目中,需要说明模型“为什么检测到这个目标”,尤其是医疗、工业等对可解释性要求高的场景。而热力图可视化。 阅读详情

相关推荐

FPGA人脸识别检测(先获取人脸图像以及灰度二值化)

由于图片有空洞等缺陷,所以后面要进行中值滤波、腐蚀、膨胀等算法处理,然后再对人脸进行框选,最后显示出来。最终的成像应该是下面这样的。(后面有时间再接着做哈哈哈)5、通过modelsim将操作后的图片数据写入gray_img.txt里面后,用matlab将txt转成图片。1、先用matlab将图片转换成txt数据,代码如下。读取图片的方式按照博客咸鱼里的方式来做,如下。2、FPGA读取txt数据。4、FPGA顶层模块及仿真。3、FPGA灰度二值化。

weixin_46312715的博客 2528

Java 反射详解

  反射反射,程序员的快乐! 1、什么是反射?     Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby...

weixin_33978016的博客 187

Zemax实现微透镜阵列光束整形(原理+仿真)

通过Zemax实现微透镜阵列的光场整形仿真。

VJCP_90909Bu0的博客 1万+

Java反射详解

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.反射就是把java类中的各种成分映射成一个个的Java对象。

weixin_74268571的博客 2万+

Ollama最新快速上手指南:从安装到精通本地AI模型部署

想让Ollama跑你的"私房模型"?三种主流格式全支持,总有一款适合你!GGUF格式(推荐新手首选)创建Modelfile文件:执行创建命令:运行你的专属模型:PyTorch/Safetensors格式(适合进阶玩家)先用库测试模型能否正常加载确保模型结构完整后再导入Ollama官方文档有详细转换指南专业小贴士GGUF格式最轻量,PyTorch最灵活,Safetensors最安全遇到问题?试试用llama.cpp进行格式转换7B参数模型推荐使用q4_0量化级别想让AI用马里奥。

全世界的博客 2308

《LabVIEW ZYNQ实战指南》第6章>>案例解析:基于USB WiFi模块的ZYNQ无线通信部署与Linux RT开发

本文详细解析了如何为ZYNQ开发板部署USB WiFi模块,实现无线通信。通过LabVIEW Linux RT环境,利用封装好的驱动VI,开发者可轻松配置ZYNQ连接无线网络,摆脱网线束缚,实现程序无线部署与远程调试,为工业物联网应用奠定基础。

app77的博客 754

Java 中的反射机制(两万字超全详解)

文章目录一、反射概述1. 什么是反射?2. 反射机制原理3. 反射优点和缺点4. 类加载概述5. 类加载各阶段完成的功能5.1 加载阶段5.2 连接阶段——验证5.3 连接阶段——准备5.4 连接阶段——解析5.5 初始化阶段二、Class 类1. 动态加载2. 小结三、访问字段1. 获取字段值2. 设置字段值3. 小结四、调用方法1. 调用方法2. 调用静态方法3. 调用非 public方法4. 多态5. 小结五、调用构造方法六、获取继承方法1. 获取父类的Class2. 获取interface3. 继承

林二月的博客 3万+

什么是 PD 电压诱骗?

电压诱骗” 的意思就是,使用某些方法让 PD 充电器误以为设备需要更高的电压,从而让充电器提供比实际需要更高的电压。手机可能只需要 5V,但笔记本电脑可能需要 20V,通过 PD 协议,充电器能够根据设备的需求输出合适的电压和电流。在“电压诱骗”的情况下,你通过某种手段让充电器以为设备需要 12V,于是充电器会按照这个伪造的请求输出 12V,而不是默认的 5V。充电器评估自己的能力,如果可以提供设备需要的电压和电流,它会调整输出电压,从默认的 5V 切换到设备请求的电压(如 12V)。

qq_45430571的博客 2657

java反射之详解

1.在Java中,反射是指程序在运行时可以观察和修改自己的行为的能力。反射使得程序可以动态地获取类型信息、访问对象的属性和方法,并调用方法,而不需要提前在代码中编写对应的静态类型和调用代码。借助反射,程序可以在运行时动态地加载和使用类,而不需要在编译时知道有哪些类存在。反射常用于框架开发、插件化和动态代理等场景。在Java中,反射API包括java.lang.reflect包中的类和接口,这些API允许程序获取类型信息、构造类实例、访问和修改字段和方法等。

m0_74018330的博客 729

机器人全局路线规划导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对全局路线规划导读做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1503

复现基于混频因子模型的GDP即时预测方法

基于混频因子模型的GDP即时预测方法复现 本文复现了混频因子模型(MIDAS)在GDP即时预测中的应用。该方法整合7个月度宏观经济变量(工业增加值、CPI、PMI等)与季度GDP数据,通过状态空间模型实现高频预测。技术实现包括:1)使用PCA提取潜在共同因子;2)构建状态空间模型处理混频数据;3)通过卡尔曼滤波进行参数估计。实证结果显示模型预测效果良好(测试集R²=0.82),其中工业增加值对因子1贡献最大(0.82),CPI对因子2贡献显著(0.78)。该方法为决策者提供了更及时的季度GDP估算。

huanghm88的专栏 600

Java反射

1,什么是反射?     Java的反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性而这也是Java的被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python和红宝石是动态语言,C ++,Java和...

pan_yuyuan的博客 426

用Obsidian搭建个人知识库:AI时代如何构建你的第二大脑

AI 时代,真正有价值的不只是获取知识,而是沉淀属于自己的知识体系。本文从 Obsidian 安装、目录设计、双向链接、插件推荐到 AI 联动、多端同步,手把手教你打造高效、可持续进化的个人知识库,让知识真正为你所用。🧠

XiaoqiangClub的博客 456

Java 反射小结

反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。

记录移动开发相关的知识 493

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA反射小结

反射 动态获取类中方法和属性,称为JAVA发射。 应用场景 1.对外暴露接口,使功能扩展。 根据名称–>找到类文件–>对类文件进行调用 tomcat提供了处理请求和应答的方式。 因为具体的处理动作不同,对外提供了接口,由开发者提供具体 反射常配置: 配置文件+接口 获取字节码文件,获取对象,获取属性,获取方法。 ...

myyougod01的博客 192

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java反射知识点小结

参考代码:https://github.com/ZhangXiaoixiang/reflectdemo 说明:收集的网上资料,自己整理收集 视频教程(腾讯课堂): https://ke.qq.com/webcourse/index.html#cid=298879&term_id=100354189&taid=2094161629319039&vid=t1426y3hmo...

长草颜团子 19万+

假人有限元模型

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

Java的反射小结

1.概述       Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。说白了就是在这个类被加载到内存中还没执行其中的方法时,对其进行操作,可以获取其中的成员对其修改,使其具有更强大的功能。本人总结了一些基本的反射操作,方便以后回忆。 2...

KonwAfterWords的博客 275

Java反射机制小结

1 Java反射机制概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 1.1Java反射机制提供的功能 Ø在运行时判断任意一个对象所属的类 Ø在运行时构造任意一个类的对象 Ø在运行时判断任意一个类所具有的成员变量和方法 Ø在运行时调用任意一个对象的成员变量和...

一枝韩独秀的博客 1585

关于java中反射的小结

一、Class 1、Class是一个类,封装了当前对象所对应的类的信息 2、小写class表示是一个类类型,大写Class表示这个类的名称 3、对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。 4.Class 对象只能由系统建立对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例 获取...

aiding1994的博客 120

java反射总结_java反射小结

最近一直在接触java的框架都是通过配置 xml文件, 然后进行功能的实现,主要依赖的的就是java的反射机制反射小结1. Class: 是一个类; 一个描述类的类.封装了描述方法的 Method,描述字段的 Filed,描述构造器的 Constructor 等属性.2. 如何得到 Class 对象:2.1 Person.class2.2 person.getClass()2.3 Class.fo...

weixin_39524984的博客 103

java反射学习小结

反射学习小结

m0_63521458的博客 201

Java反射学习小结

反射,Class类,类加载,理解以及基础知识汇总

m0_62265391的博客 229
上一篇: Java中的深拷贝与浅拷贝小结
下一篇: Java注解小结
Archie敲键盘
博客等级 码龄7年 9粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值