JavaEE企业开发新技术

目录

2.1  Class对象基本概念

1、概念

2.2 Class对象的获取方式

2.3基本数据类型的Class对象

1、概念

2.4 反射的基本概念

概念

2.5 Class对象的基本使用-1

2.6 Class对象的基本使用-2

newInstance()和new()区别:


2.1  Class对象基本概念

1、概念

反射的基础——Class

Java当中的类用来表示具有相同属性和方法的对象的结合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性价值

Java当中定义的所有类都属于同一类事物,可以用Class来表示

Class类的对象就是不同的类对应的字节码

获取Class对象:

A a=new A()

获取Class对象的三种方式

  1. 创建对象,通过对象名调用getClass拿到Class对象

Person p1=new Person();

P1.getClass();

  1. 直接通过类名.Class拿到Class对象

Person.class

  1. Class.forName()方法

Class.forName(“java.lang.String”)

2、示例代码

public class Person {

private Integer id;

private String name;



public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Person(Integer id,String name) {

super();

this.id=id;

this.name=name;

}

@Override

public String toString() {

return "Person [id=" + id + ", name=" + name + "]";

}

public Person() {

super();

}

}

  

public class Test {

    public static void main(String[] args) throws ClassNotFoundException{

        Person p = new Person();

        Class clazz1=p.getClass();


        Class clazz2=Person.class;


        System.out.println(clazz1);

        System.out.println(clazz2);


        Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");

        System.out.println(clazz3);

    }


}

2.2 Class对象的获取方式

  1. 通过对获取Class对象的三种方式的实现,了解到,对同一个类来讲,不管用哪种方式获取Class对象,获取到的Class对象是唯一的,满足单例模式。
  2. 源码:
public class Test {

        public static void main(String[] args) throws ClassNotFoundException{

                Person p = new Person();

                Class clazz1=p.getClass();

                Class clazz2=Person.class;

                System.out.println(clazz1==clazz2);

                Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");

                Class clazz4=Class.forName("cn.edu.xync.myweb.reflect.Person");

                System.out.println(clazz3==clazz4);

        }

}

2.3基本数据类型的Class对象

1、概念

java从大的方面分类,一个是基本数据类型,一个是复合数据类型,java当中的基本数据类型有:boolean  int  short  byte  char  long  float 和 double 它们也有各自的Class对象

例如:int.class

void也有自己对于的Class对象(void.class)

基本数据类型对应的封装类有属性TYPE(常量),这个属性代表了封装类所封装的基本数据类型的Class对象。

Int.class==Integer.TYPE

void.class==Void.TYPE

代码

System.out.println(int.class==Integer.TYPE);


System.out.println(boolean.class==Boolean.TYPE);


System.out.println(float.class==Float.TYPE);


System.out.println(void.class.getName());

//表示对应数据类型的封装类可以表示基本数据类型的Class对象

2.4 反射的基本概念

  1. 概念

反射就是把java类中的各个组成部分映射成相应的java类

一个类的组成部分包括:属性、方法、构造方法、包等,这些组成部分都会被映射成相应的类。

Class类定义了一系列方法来获取java类的属性、方法、构造方法、包等信息,这些信息都有相应的来表示,分别是Field、Method、Constructor、Package等。

java.lang.Class:代表一个类

java.lang.reflect.Method:代表类的方法

java.lang.reflect.Field:代表类的成员变量

java.lang.reflect.Constructor:代表类的构造器

注意:表示java类组成部分的各种类位于java.lang.reflect包

  1. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
  2. 对于任意一个对象,都能够调用它的任意一个方法和属性;
  3. 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

当要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。

通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

2.5 Class对象的基本使用-1

要进行反射操作必须要拿到这个类对应的Class对象

Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");

Class clazz4=Class.forName("cn.edu.xync.myweb.reflect.Person");

Package p=clazz3.getPackage();

System.out.println(p.getName());


Constructor con1=clazz3.getConstructor();//得到构造方法

System.out.println(con1.getName());//拿到构造方法的名称


Person person1=(Person) con1.newInstance();//通过无参构造方法创建对象1

System.out.println(person1);


Person person2=(Person) con1.newInstance();//通过无参构造方法创建对象2

System.out.println(person2);

通过构造方法创建的两个对象的hash code编码是不一样的说明是创建了两个不同类型的对象

本次主要学习了通过反射如何得到包的信息,和得到对应的构造方法的信息

2.6 Class对象的基本使用-2

一个类可能会定义多个重载的构造方法,当定义有参构造时,在创建对象时可以加入参数

Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");

Class clazz4=Class.forName("cn.edu.xync.myweb.reflect.Person");

Package p=clazz3.getPackage();

System.out.println(p.getName());


Constructor  con3=clazz3.getConstructor(Integer.class,String.class);//得到一个带有参数的构造方法(通过反射的方式创建)


Person p3=(Person)con3.newInstance(100,"小明");//创建对象并传入参数

System.out.println(p3);

Constructor<Person>[] con=clazz3.getConstructors();



for(Constructor con4:con) {

System.out.println(con);

}

//通过Constructors可以得到Person类中的所有构造方法,再通过for循环来遍历输出每个构造方法

newInstance()和new()区别:

  1. 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类。
  2. newInstance创建类是这个类必须已经加载过且已经连接,new创建类是则不需要这个类加载过

3、new是一个关键字;而newInstance是Class类中的一个方法,并且应用到了反射机制,相当于逆向创建对象,而new则是顺序创建对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443118.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试经典150题——合并两个有序链表

You just work on it. Time will do the rest! 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个题目还是比较简单的&#xff0c;通过分析题目&#xff0c;我们可以知道题目中关键信息为&#xff1a; 所以我们只需要从前向后遍历两个链表&#xff0c;在两个链表不空的情况下&…

白皮书发布|超融合运行 K8s 的场景、功能与优势

目前&#xff0c;不少企业都使用虚拟化/超融合运行 Kubernetes 和容器化应用。一些用户可能会有疑惑&#xff1a;既然 Kubernetes 可以部署在裸金属上&#xff0c;使用虚拟化不是“多此一举”吗&#xff1f; 在电子书《IT 基础架构团队的 Kubernetes 管理&#xff1a;从入门到…

Android中显式Intent和隐式Intent的区别

1、intent的中文名 称是意图&#xff0c;Intent是各个组件之间信息沟通的桥梁&#xff0c; 既能在Activity之间沟通&#xff0c;又能在Activity与Service之间沟通&#xff0c;也能在Activity与Broadcast之间沟通 **intent组成元素的列表说明**2、显式Intent&#xff0c;直接指定…

河北专升本(C语言编程题)

一&#xff1a;基础算法原理 1. 冒泡排序 原理&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序为例&#xff0c;第一轮比较后&#xff0c;所有数中最大的…

软考71-上午题-【面向对象技术2-UML】-UML中的图2

一、用例图 上午题&#xff0c;考的少&#xff1b;下午题&#xff0c;考的多。 1-1、用例图的定义 用例图展现了一组用例、参与者以及它们之间的关系。 用例图用于对系统的静态用例图进行建模。 可以用下列两种方式来使用用例图&#xff1a; 1、对系统的语境建模&#xff1b…

自动驾驶革命:解密端到端背后的数据、算力和AI奇迹

作者 |毫末智行数据智能科学家 贺翔 编辑 |祥威 最近&#xff0c;特斯拉FSD V12的发布引发了业界对端到端自动驾驶的热议&#xff0c;业界纷纷猜测FSD V12的强大能力是如何训练出来的。从马斯克的测试视频可以大致归纳一下FSD V12系统的一些核心特征&#xff1a; 训练数据&am…

Redis的集群模式

Redis有三种主要的集群模式&#xff0c;用于在分布式环境中实现高可用性和数据复制。这些集群模式分别是:主从复制(Master-Slave Replication)、哨兵模式(Sentinel)和Redis Cluster模式。 主从模式 主从复制是Redis最简单的集群模式。这个模式主要是为了解决单点故障的问题&a…

探索Cglib:解析动态代理的神奇之处

文章目录 CGLIB介绍CGLIB使用示例CGLIB核心原理分析代理类分析代理方法分析 FastClass机制分析 CGLIB介绍 CGLIB(Code Generation Library)是一个开源项目&#xff01;是一个强大的&#xff0c;高性能&#xff0c;高质量的Code生成类库&#xff0c;它可以在运行期扩展Java类与…

【echarts】xAxis鼠标事件失效问题

项目中用到echarts柱状图&#xff0c;出现x轴标签文字过长重叠问题&#xff0c;在pass掉标签倾斜、换行方案之后最终决定限制文字长度&#xff0c;超出以…占位&#xff0c;鼠标悬浮时显示完整tooltip。 但编写过程中发现xAxis鼠标事件无法触发&#xff0c;只有bar区域是可触发…

19 卷积层【李沐动手学深度学习v2课程笔记】

目录 1. 从全连接到卷积 2. 卷积层 3. 图像卷积代码 3.1 互相关运算 3.2 实现二维卷积层 3.3 图像中目标的边缘检测 3.4 学习卷积核 4. 小结 1. 从全连接到卷积 在欧几里得几何中&#xff0c;平移是一种几何变换&#xff0c;表示把一幅图像或一个空间中的每一个点在相同…

mysql中insert … select锁范围

1、执行 insert … select 的时候&#xff0c;对目标表也不是锁全表&#xff0c;而是只锁住需要访问的资源。 例如&#xff0c; CREATE TABLE t (id int(11) NOT NULL AUTO_INCREMENT,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY c (c) ) EN…

streamlit初学-用streamlit实现云台控制界面

用streamlit实现云台控制界面 效果图PC上的效果手机上的效果 源码: 本文演示了,如何用streamlit做一个云台控制界面。功能包括:用户登录,事件的处理,图片的更新 版本信息: streamlit_authenticator: 下载链接streamlit : 1.31.1python: 3.11 修改点: streamlit_authenticato…

【嵌入式】字体极限瘦身术:Fontmin在嵌入式UI中的魔法应用(附3500常用汉字)

1. 概述 在嵌入式系统的用户界面&#xff08;UI&#xff09;设计中&#xff0c;字体的选择和优化至关重要。一个恰当的字体不仅能够提升用户体验&#xff0c;还能彰显产品特色。然而&#xff0c;由于嵌入式设备常常受限于存储空间和处理能力&#xff0c;大型字体文件可能成为性…

arkTS语法

lineHeight与css不同&#xff1f; 1、arkTS是什么 在继承了TS语法的基础上&#xff0c;主要扩展了声明式UI开发相关的能力 声明式UI是一种编写用户界面的范式。 2、声明组件的完整语法 3、自定义组件的语法使用 struct arkTS新增的关键字&#xff0c;是用于自定义组件或者自…

餐饮行业咨询数据在哪里查找?

1.中国饭店协会&#xff1a;国资委和商务部等政府指导发展&#xff0c;参与制定行业国家标准、行业标准与行业自律规则。按月出版《中国饭店业》会员刊物、及时更新协会官方网站和官方微信&#xff0c;方便会员单位及时掌握国内外饭店与餐饮业的最新动态。宣传企业经典案例、反…

使用jquery的autocomplete属性实现联想补全操作

平时使用百度&#xff0c;淘宝等软件搜索时&#xff0c;常见一个搜索框联想提示&#xff0c;感觉确实好用但没有研究过原理&#xff0c;最近恰巧工作中遇到一个同样的场景&#xff0c;不同于大厂使用高端的Python&#xff0c;这次需要使用jQuery的autocomplete属性来自动联想补…

【深度学习笔记】6_7 门控循环单元(GRU)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.7 门控循环单元&#xff08;GRU&#xff09; 上一节介绍了循环神经网络中的梯度计算方法。我们发现&#xff0c;当时间步数较大或者…

vue 下载的插件从哪里上传?npm发布插件详细记录

文章参考&#xff1a; 参考文章一&#xff1a; 封装vue插件并发布到npm详细步骤_vue-cli 封装插件-CSDN博客 参考文章二&#xff1a; npm发布vue插件步骤、组件、package、adduser、publish、getElementsByClassName、important、export、default、target、dest_export default…

HTML静态网页成品作业(HTML+CSS+JS)——和平精英介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有4个页面。 二、作品…

Pytorch学习 day08(最大池化层、非线性激活层)

最大池化层 最大池化&#xff0c;也叫上采样&#xff0c;是池化核在输入图像上不断移动&#xff0c;并取对应区域中的最大值&#xff0c;目的是&#xff1a;在保留输入特征的同时&#xff0c;减小输入数据量&#xff0c;加快训练。参数设置如下&#xff1a; kernel_size&#…