Java面向对象—反射

Java开发笔记(七十八)面向对象的后门——反射 作为一门面向对象的编程语言,Java认为一切皆是对象,每个对象都能归属于某个类,甚至每个类均可提取出一种特殊的类型,即Class类型。早在前面介绍多态的时候,就提到每个类都存在独一无二的基因,通过比较实例的类基因与具体类名的类基因,即可分辨某个实例是否属于目标类。例如,若想获取公鸡类的类型,则可通过“类名.class”得到该类的Class对象,详细的获取代码如下所示: // 第一种方式:通过“类名... 阅读详情

反射

1、反射(Reflection):是Java被视为“动态”语言的关键,反射机制允许在执行期间借助于Reflection的API取得任何类(接口)的内部信息,并能直接操作任意对象的内部信息。

2、Java反射机制主要提供了以下功能:

(1)在运行时构造任意一个类的对象

(2)在运行时获取任意一个类所具有的成员变量和方法

(3)在运行时调用任意一个对象的方法(属性)

(4)生成动态代理

3、获得Class 类的三种方式:

(1)类名.Class 如:Person.Class

(2)实例名.getClass() Person person = new Person(); person.getClass();

(3)Class.forName("全类名"); Class.forName("com.jdbc.mysql.Driver");

package _18反射.d1;
​
public class Student {
    String name;//姓名
    int age;//年龄
    public Student() {}
    public Student(String name, int age) {this.name = name;this.age = age;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}
package _18反射.d1;
​
/**获取class类
 * @author Lx
 * @create 2024-03-19 21:29
 * 获取class类的三种方式:
 * (1)类名.class;
 * (2)实例名.getClass();
 * (3)Class.forName("全类名");
 */
public class GetClassTest {
    public static void main(String[] args) throws ClassNotFoundException {
        //1类名.class()
        //Class c1=Student.class;
        System.out.println(Student.class);
​
        //2、实例名.getClass();
        Student stu=new Student();
        System.out.println(stu.getClass());
​
        //3、Class.forName("全类名")
        Class c3=Class.forName("_18反射.d1.Student");
        System.out.println(c3);
    }
}

4、利用反射获取属性的值

package _18反射.d2;
/**
 * @author Lx
 * @create 2024-03-19 21:28
 */
public class Student {
    public String name;//姓名
    private int age;//年龄
    private String add;//地址
    public Student() { }
    public Student(String name, int age,String add) {this.name = name;this.age = age;this.add=add; }
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    public String getAdd() {return add;}
    public void setAdd(String add) {this.add = add;}
}

获取公共属性的值和私有化属性的值:

package _18反射.d2;
import java.lang.reflect.Field;
/**
 * @author Lx
 * @create 2024-03-19 22:03
 * 获取
 */
public class GetFieldTest {
    public static void main(String[] args) {
        test1();
        test2();
    }
    //获取公共属性name的值
    public static void test1(){
        try {
            //1、获取JVM中的class
            Class c=Class.forName("_18反射.d2.Student");
            //2、通过class取属性,公共属性name
            Field field=c.getField("name");
            //3、通过属性调值(得先有对象)
            Student stu=new Student("张三",18,"云南");//定义去属性name依赖的对象stu
            System.out.println(field.get(stu));//调属性name的值
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    //获取私有化属性age的值
    public static void test2(){
        try {
            //1、加载并取到class
            Class c=Class.forName("_18反射.d2.Student");
            //2、通过class取到属性(字段),取私有化的age
            Field field=c.getDeclaredField("age");
            //System.out.println(field);
            //3、获取属性的值,得先有对象
            Student stu=new Student("李四",19,"贵州");
            //设置field对象的可访问性,否则取不到私有化的age值
            field.setAccessible(true);
            System.out.println(field.get(stu));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

5、利用反射获取方法

package _18反射.d3;
/**
 * @author Lx
 * @create 2024-03-19 21:28
 */
public class Student {
    public String name;//姓名
    private int age;//年龄
    private String add;//地址
    
    public Student() {
    }
    public Student(String name, int age, String add) {
        this.name = name;
        this.age = age;
        this.add=add;
        System.out.println("执行了有参构造方法");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAdd() {
        return add;
    }
    public void setAdd(String add) {
        this.add = add;
    }
    //普通方法
    public void show(){
        System.out.println("这是无参数的方法");
    }
    public void show(String str){
        System.out.println("这是一个参数的方法:str:"+str);
    }
    private void show(String str,int num){
        System.out.println("这是两个参数的方法:str:"+str+",num:"+num);
    }
}
package _18反射.d3;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * @author Lx
 * @create 2024-03-20 15:45
 */
public class getMethodTest {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
        test5();
    }
    //调公共无参方法
    public static void test1(){
        try {
            //1、获取JVM中的class
            Class c=Student.class;
            //2、用class获取公共方法
            Method m=c.getMethod("show");
            //3、调对象中的方法
            Student stu=new Student();
            m.invoke(stu);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    //调公共有参方法
    public static void test2(){
        try {
            //1、获取JVM中的class
            Class c=Student.class;
            //2、获取类中带参数的公共方法
            Method m=c.getMethod("show",String.class);
            //3、获取对象中的方法
            Student stu=new Student();
            m.invoke(stu,"张三丰");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    //调私有化有参方法
    public static void test3(){
        try {
            //1、获取JVM中的class
            Class c=Student.class;
            //2、获取类中的私有化带参方法
            Method m=c.getDeclaredMethod("show",String.class,int.class);
            //3、获取对象中的方法
            Student stu=new Student();
            m.setAccessible(true);//获得访问权限
            m.invoke(stu,"李四",50);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    //调空构造方法
    public static void test4(){
        try {
            //1、获取class
            Class c=Student.class;
            //2、获取class中的构造方法
            Constructor con=c.getConstructor();
            //3、把获取到的构造方法进行实例化,等号右边就相当于是new构造方法
            //Student stu=new Student();
            Student stu= (Student) con.newInstance();
            stu.show();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    //调有参构造方法
    public static void test5(){
        try {
            //1、获取class
            Class c=Student.class;
            //2、获取class中的构造方法
            Constructor con=c.getConstructor(String.class,int.class,String.class);
            //3、把获取到的构造方法进行实例化,等号右边就相当于是new构造方法
            //Student stu=new Student();
            Student stu= (Student) con.newInstance("张五",20,"四川");
            stu.show();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
保姆级教程:在Ubuntu 20.04上从源码编译Apollo自动驾驶平台(含GPU环境配置) 本文提供了一份详细的Ubuntu 20.04上从源码编译Apollo自动驾驶平台的保姆级教程,包括GPU环境配置、Docker部署和编译构建等关键步骤。通过实战经验和避坑指南,帮助开发者高效完成Apollo平台的编译和验证,适用于自动驾驶技术研究和应用开发。 阅读详情

相关推荐

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6634

Java——对象(反射篇)

反射介绍 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制,可以实现以下功能: ①在运行时判断任意一个对象所属的类。 ②在运行时构造任意一个类的对象。 ③在运行时判断任意一个类所具有的成员变量和方法。 ④在运行时调用任意一个对象的方法。 ⑤生成动态代理。 获取源头Class 所有类的对象其实都是Class的实例。 这个Class实例

Java_Course01的博客 763

SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

二维回波信号分析

zr2006_7的专栏 2万+

面向对象——反射

使用命名空间:System.Refection。 作用:可以查看编译好的类库的内容。 反射的三种用法:1、查看元数据。2、动态创建对象。3、动态调用方法。 反射的用途: (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有...

AI浩 6664

H3C模拟器HCL防火墙路由模式主备配置实验

摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商

LQ的博客 1121

5.FxBlue跟单常见问题

fxblue喊单ea和fxblue跟单会在mt4/mt5客户端ea栏目里记录fxblue在跟单复制订单过程中的全面记录。在遇到问题时,我们首先要恢复默认参数尝试,然后再到ea栏找报错提示。 ​ 需要注意的是,是EA选项卡,而不是日志选项卡。 此外,您可以在 MT4/5 软件终端面板的"EA"选项卡中查看跟单记录,您可以通过右键单击 Experts 日志并从 MT4/5 的弹出菜单中选择“打开”来打开每日日志文件以及历史文件。 5.1 No “heartbeat” received 没有收到“心跳” 接收方

weixin_44406393的博客 1872

Java反射介绍

总结介绍java反射基本知识,希望对java安全初学者有所帮助。

派大星的博客 1692

车载以太网网络测试-24【SOME/IP概述】

SOME/IP**(Scalable Service-Oriented Middleware over IP)是一种基于IP网络的面向服务的通信协议,专为汽车电子系统设计,支持服务发现、远程过程调用(RPC)和事件通知等功能。核心标准是由 AUTOSAR(汽车开放系统架构)定义,现已成为车载通信的重要标准之一(如AUTOSAR 4.0+)。SOME/IP的全称是,它是一种基于IP网络的面向服务的通信协议,广泛应用于汽车电子(AUTOSAR)和物联网领域。Scalable(可扩展的)含义。

车载网络测试工程师的博客 2186

Java 基础进阶篇(十七):反射概述及获取对象的方式

一、反射概述 二、反射获取类对象 三、反射获取构造器对象 四、反射获取成员变量对象 五、反射获取方法对象 六、 反射的作用 6.1 绕过编译阶段为集合添加数据 6.2 通用框架的底层原理

秀岩的博客 4450

从数据到行动:客服运营必分析的8大核心维度

服务运营正从被动响应升级为数据驱动型战略体系。客服中心的海量交互数据能精准反映服务效能、客户体验及运营短板,关键在于实现数据的可视化与可操作化。本文系统剖析了八类核心数据指标:1)客户行为数据(CSAT/NPS/投诉内容);2)通话效率指标(AHT/接通率);3)服务质量(质检体系/情绪识别);4)坐席绩效(FCR/客户评价);5)流程与知识库(转接率/工单时效);6)渠道流量分析;7)异常预警机制;8)成本收益模型。通过构建多维数据分析体系,企业可在客户全生命周期管理中实现服务升级、风险防控与资源

2202_75469062的博客 1400

启动launch文件时显示找不到franka_ign_ros2_control-system...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 694

Java反射详解

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

weixin_74268571的博客 2万+

从码农到生态建造者:我的一人公司运作方案

华哥·OPC 运营方案 v1.0 - 第一次迭代 🚀,搭建闭环生态系统,赋能 AI 时代的超级个体,更好的做自己,同时照亮别人。

AaronZZH 的博客 994

Java反射API与面向对象编程的关系

在运行时查询类的属性和方法。创建对象实例。调用方法。修改私有属性的值。这些功能使得反射API成为实现动态编程的强大工具,尤其是在需要处理不确定的类和方法时。

2401_87849308的博客 855

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 反射 -- 理解面向对象思想

Java 反射Class 类类型获取类类型的三种方法动态加载类及使用类类型创建对象使用类类型获取该类的信息类名方法对象(方法名、返回值的类类型、参数的类类型)成员变量对象(类类型)构造方法对象(方法名、参数的类类型)方法的反射操作 Class 类类型 理解java反射,有助于深入理解java面向对象思想,即万事万物皆对象(除了基本数据类型和静态成员变量) 类是对象,是 java.lang.Cla...

FutureBook 376

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...

【Java】反射调用与面向对象结合使用产生的惊艳

我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用。 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑什么,这可是Spring的源码,肯定不会有错。 不过我去做了测试,发现确实是正确的,那一瞬间竟然给我了一丝的惊艳。 这其实是面向对象(继承与重写,即多态)和反射结合的产物。下面先来看测试,最后再进行总结。 友情提示:测试内容较多,不过还是值得一看。 具体方法的继承与重写 先准备一个父类,有三个方法,分别是publ.

马小果v:ma-xiaoguo的博客 127

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java面向对象——反射

面向对象 反射 理解反射的概念 反射就是把Java类中的各种成分映射相成Java类。 例如:众多的人用一个Person类来表示,那么众多的Java类就用一个Class类来表示。 反射也称为对类的解剖。把类的各个组成部分映射成一个个相应的Java类。

新长城 1343

Java面向对象之 反射

文章目录1、反射1.1、需求引出1.2、反射机制1.2.1、Java Reflection1.2.2、Java 反射机制原理示意图1.2.3、Java 反射机制可以完成1.2.4、反射相关的主要类1.2.5、反射优点和缺点1.2.6、反射调用优化 - 关闭访问检查 1、反射 1.1、需求引出 package reflection.question; import reflection.Cat; import java.io.FileInputStream; import java.io.FileNot

一切随心走的博客 483

java 面向对象 OO 反射 "六原则一法则"

1.获得一个类的类对象有哪些方式? 答: - 方法1:类型.class,例如:String.class - 方法2:对象.getClass(),例如:”hello”.getClass() - 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)2.如何通过反射创建对象? 答: - 方法1:通过类对象调用newInstance

Donnie93的专栏 2024

Java反射API与面向对象编程:当“X光机”遇上“家族相册”

在Java的世界里,面向对象编程(OOP)就像是一本厚厚的家族相册,记录着每个成员的点点滴滴。而Java的反射API,就像是一台神奇的“X光机”,能够透视这些照片,让我们看到背后的故事。今天,我们就来聊聊这两者之间的关系,以及如何通过代码示例来展示它们的互动。

2401_87849308的博客 513

Java面向对象【反射】

Java反射解析

weixin_62584200的博客 796

java面向对象——反射

面向对象 反射 理解反射的概念 反射就是把Java类中的各种成分映射相成Java类。 例如:众多的人用一个Person类来表示,那么众多的Java类就用一个Class类来表示。 反射也称为对类的解剖。把类的各个组成部分映射成一个个相应的Java类。

u014481497的专栏 561

Java-面向对象-包、反射

系统讲解包(Package)、反射

小陈为梦想而生 864

【Java面向对象】反射机制的入门

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。并且调用该类的方法和属性。反射机制有这广泛的用途,所以,别想那么多,学就是了。

极客-多重人格递归 313

Java面向对象高级【注解和反射】

Java反射、Java注解、Java内存分析

功不唐捐,玉汝于成 483
上一篇: Java面向对象—多线程
下一篇: Oracle服务安装配置及SQLDeveloper12安装破解【保证成功,可视频教学QQ:2259418012】
得闲饮茶呃
博客等级 码龄4年 303粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值