- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java反射机制的一些学习心得小结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
之前在了解Spring的类加载机制的时候,了解了java的反射机制。但是,我对反射理解一直不深。也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什么是动态加载类?
要想知道反射到底是什么,首先需要知道java的类加载和对象创建的机制.
当我们写完一个java文件的时候,后缀是.java。在我们利用IDE执行java文件的时候,其实IDE也帮我们运行了javac,即java编译器。编译器会将.java文件编译成.class文件。java虚拟机会去读取.class文件。这时候,类加载器ClassLoader会将这些类,以及该java文件import的类加载到JVM中的方法区。这些被加载的类的类型都是Class,习惯称之为类对象.
对象的创建,即是根据这些Class类对象,在堆区创建对象.
这时候,反射就很好理解了。反射的目的就是获取这些Class类对象 。
目前我知道可以利用反射返回类对象的方式有四种:
1.如果你知道类的路径:
1
|
Class aclass = Class.forName(
"类的路径"
);
//如java.util.ArrayList,你就可以获得ArrayList的类对象
|
2.如果你知道类:
1
|
Class aclass = ArrayList.
class
;
|
3.如果你实例化对象:
1
2
|
ArrayList<Integer> array =
new
ArrayList<Integer>();
Class aclass = array.getClass();
|
4.通过类加载器加载(个人不经常用忘记了hhh) 。
获得Class类对象,我们可以非常轻松的获取到该类的字段和方法,我们甚至可以得到该类的父类:如:getMethod,getConstructor... 就是获取类对象的方法,构造器等等,这些可以去网上查到相应的资料,这里不做赘述.
我们得到了Class类对象,我们就可以利用Class类对象创建一个对象实例了!这里就是工厂模式的利用方法,将所有类创建的工作交给工厂类实现,并将创建的对象返回即可。这样就能方便管理对象创建的工作。利用反射,创建对象的例子:
1
2
3
|
//利用反射机制创建一个ArrayList的对象
Class aclass = Class.forName(
"java.util.ArrayList"
);
//依靠反射,获取ArrayList的类对象
ArrayList<Integer> array = (ArrayList<Integer>)aclass.newInstance();
//利用Class类对象,创建ArrayList类
|
之前我也不知道什么是静态加载,什么是动态加载,看了一个人的博客豁然开朗:点击连接 。
他说的很清楚了:java中的new方法是静态加载,因为new方法是在编译阶段就会检查,而不是在运行阶段。反射是可以在运行时创建对象,调用对象的方法、变量等.
该博客作者利用了两个例子进行诠释 。
静态加载:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//定义接口
interface
OfficeAble{
public
void
start();
}
//Main
class
Office{
public
static
void
main(String[] args){
if
(args[
0
].equals(
"Word"
)){
Word w =
new
Word();
w.start();
}
if
(args[
0
].equals(
"Excel"
)){
Excel e =
new
Excel();
e.start();
}
}
//Word类
class
Word
implements
officeAble{
public
void
start(){
System.out.println(
"Word Start"
);
}
|
这样会报错。静态加载会在编译阶段将Class类对象加载进方法区,因为这里没有定义Excel类,编译器就会报错.
动态加载:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//接口和Word类同上,修改一下Main方法
class
Office{
public
static
void
main(String[] args){
try
{
Class c = Class.forName(args[
0
]);
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}
catch
(Exception e){
e.printStackTrace();
}
}
|
这样就能成功运行,利用反射,只要知道接口,能很好的提高扩展性!不管写多少个类,只要继承接口,都可调用.
到此这篇关于java反射机制的一些学习心得的文章就介绍到这了,更多相关java反射机制内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/1326375426lhf/p/14423443.html 。
最后此篇关于java反射机制的一些学习心得小结的文章就讲到这里了,如果你想了解更多关于java反射机制的一些学习心得小结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 前言 style-loader css-loader sass-loader postcss-loader babel-l
目录 1、简单动态字符串(SDS) 2、链表 3、字典 哈希表 哈希表节点 字典 4、跳跃表
JS运行三部曲 js运行代码共分三步 语法分析 预编译 解释执行 JavaScript代码在运行时,首先会进行语法分析,通篇检查代码是否存在低级错误,然后进行预编译,整理内
目录 +拼接方式 sprintf函数 Join函数 buffer.Builderbuffer.WriteString函数 buffer.B
下面整理下python有哪些方式可以读取数据文件。 1. python内置方法(read、readline、readlines) read() : 一次性读取整个文件内容。推荐使用re
背景 项目中的流程监控,有几种节点,需要监控每一个节点是否超时。按传统的做法,肯定是通过定时任务,去扫描然后判断,但是定时任务有缺点:1,数据量大会慢;2,时间不好控制,太短,怕一
目录 1. 提炼函数 2. 合并重复的条件片段 3. 把条件分支语句提炼成函数 4. 合理使用循环 5. 提前让函数退出代替嵌套条件分支
开始之前,pandas中dataframe删除对象可能存在几种情况 1、删除具体列 2、删除具体行 3、删除包含某些数值的行或者列 4、删除包含某些字符、文字的行或者列 本文就针对这四种情况探讨
setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理。 工作原理 小程序的视图层
下面是五种实现斐波那契数列的方法 循环 ? 1
一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第
python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。本文主要介绍了一些简单易懂最常用的python图像处理库。 当今世界充满了各种
流式布局 采用流式布局会将元素按从左到右的顺序排列,如果一个元素在一行中放不下,那这个元素会另起一行依然按照从左到右的顺序排列 示例: 代码 public class Tes
@PropertySource 作用是:对自定义的properties文件加载 使用:@PropertySource(value={"classpath:people.properti
实现消息队列的两种方式 apache activemq官方实例发送消息 直接在apache官网http://activemq.apache.org/download-archives.html下
常用配置 以下配置能使用File -> New Projects Settings -> Settings for New Projects进行配置的尽量用这个配置,因为这个配置是作用
摘要: 开发者开发部署web应用时通常使用tomcat服务器,很多初学者只懂得在开发工具上配置,但离开了开发工具,自己手动配置部署,并让一个项目跑起来,你会了吗。小编也遇到过这样的困扰。网上查找的
1. 字符串的翻转 利用切片 ? 1
cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结。 1.cookie存在于浏览器 随意打开一个网址,用火狐的调试工具,随意选取
1、使用内置的tomcat,通过java -jar的方式启动 比如:java -jar bms.jar 但是这种启动方式 一旦关闭控制台 或者crtl+c 退出 此时应用就关闭了
我是一名优秀的程序员,十分优秀!