概述

之前在了解Spring的类加载机制的时候,了解了java的反射机制。但是,我对反射理解一直不深。也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什么是动态加载类?

什么是反射?

要想知道反射到底是什么,首先需要知道java的类加载和对象创建的机制。

当我们写完一个java文件的时候,后缀是.java。在我们利用IDE执行java文件的时候,其实IDE也帮我们运行了javac,即java编译器。编译器会将.java文件编译成.class文件。java虚拟机会去读取.class文件。这时候,类加载器ClassLoader会将这些类,以及该java文件import的类加载到JVM中的方法区。这些被加载的类的类型都是Class,习惯称之为类对象

对象的创建,即是根据这些Class类对象,在堆区创建对象。

这时候,反射就很好理解了。反射的目的就是获取这些Class类对象

反射的方式

目前我知道可以利用反射返回类对象的方式有四种:

1.如果你知道类的路径:

Class aclass = Class.forName("类的路径"); //如java.util.ArrayList,你就可以获得ArrayList的类对象

2.如果你知道类:

Class aclass = ArrayList.class;

3.如果你实例化对象:

ArrayList<Integer> array = new ArrayList<Integer>();
Class aclass = array.getClass();

4.通过类加载器加载(个人不经常用忘记了hhh)

类对象Class的用法

  1. 获得Class类对象,我们可以非常轻松的获取到该类的字段和方法,我们甚至可以得到该类的父类:如:getMethod,getConstructor... 就是获取类对象的方法,构造器等等,这些可以去网上查到相应的资料,这里不做赘述。

  2. 我们得到了Class类对象,我们就可以利用Class类对象创建一个对象实例了!这里就是工厂模式的利用方法,将所有类创建的工作交给工厂类实现,并将创建的对象返回即可。这样就能方便管理对象创建的工作。利用反射,创建对象的例子:

//利用反射机制创建一个ArrayList的对象
Class aclass = Class.forName("java.util.ArrayList"); //依靠反射,获取ArrayList的类对象
ArrayList<Integer> array = (ArrayList<Integer>)aclass.newInstance(); //利用Class类对象,创建ArrayList类

什么是动态加载?

之前我也不知道什么是静态加载,什么是动态加载,看了一个人的博客豁然开朗:博客连接

他说的很清楚了:java中的new方法是静态加载,因为new方法是在编译阶段就会检查,而不是在运行阶段。反射是可以在运行时创建对象,调用对象的方法、变量等。

该博客作者利用了两个例子进行诠释

静态加载:

//定义接口
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类,编译器就会报错。

动态加载:

//接口和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放射机制的学习心得的更多相关文章

  1. 20165221 JAVA第三周学习心得

    知识点回顾 类与对象学习总结 类:java作为面向对象型语言具有三个特性:①封装性.②继承性.③多态性.java中类是基本要素,类声明的变量叫对象.在类中定义体的函数题叫方法. 类与程序的基本结构: ...

  2. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  3. Java反射机制集中学习

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

  4. java 放射机制简介

    放射,说白了就是通过名字加载相应的类,以及类的方法和属性,是为了解决开发中不知道别人会写什么类而采取的一种顺利开发的东东. package com.io; //学生业务类 不知道别人写的 这个是别人写 ...

  5. 20165221—JAVA第六周学习心得

    课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...

  6. 20165221 JAVA第五周学习心得

    课本知识点 内部类与异常类 内部类:在一个类中定义另一个类 特点:外嵌类的成员在内部类仍然有效,内部类也可调用外嵌类的方法,内部类的类体不能声明类变量及类方法 非内部类不能是static类 匿名类:创 ...

  7. Java反射机制简单学习

    java中除了基本数据类型,几乎都为对象.例如 Person p=new Person(); 这句语句表明了p是Person类的一个实例对象.但其实,Person也是一个实例对象,它是Class类的实 ...

  8. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  9. Java反射机制——学习总结

    前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...

随机推荐

  1. 面向对象编程(UDP协议)

    UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无 ...

  2. REST架构及其介绍

    概述     REST是英文Representational State Transfer的缩写,中文翻译:表述性状态转移.     他是由Roy Thomas Fielding博士在他的论文 < ...

  3. 将将List json 转成List<?>实体

    package TestJson; import java.util.ArrayList; import java.util.List; import java.util.Map; import ne ...

  4. 36.Samba 文件共享服务1--安装及配置参数解释

    1.Samba 服务程序现在已经成为在Linux 系统与Windows系统之间共享文件的最佳选择. 1)安装: [root@localhost ~]#yum install samba Loaded ...

  5. 爬虫入门到放弃系列02:html网页如何解析

    前言 上一篇文章讲了爬虫的概念,本篇文章主要来讲述一下如何来解析爬虫请求的网页内容. 一个简单的爬虫程序主要分为两个部分,请求部分和解析部分.请求部分基本一行代码就可以搞定,所以主要来讲述一下解析部分 ...

  6. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)【ABCDF】

    比赛链接:https://codeforces.com/contest/1443 A. Kids Seating 题意 构造一个大小为 \(n\) 的数组使得任意两个数既不互质也不相互整除,要求所有数 ...

  7. AtCoder Beginner Contest 176

    比赛链接:https://atcoder.jp/contests/abc176 A - Takoyaki #include <bits/stdc++.h> using namespace ...

  8. P4570 [BJWC2011]元素 (线性基)

    题意:n个石头 每个石头有a,b两个属性 要求选出一些石头使得没有一个子集的a属性xor和为0 且b属性和最大 题解:线性基例题了.. 好像需要理解一些性质 1.原序列里任一数都可有由线性基xor得到 ...

  9. P3384 [模板] 树链剖分

    #include <bits/stdc++.h> using namespace std; typedef long long ll; int n, m, rt, mod, cnt, to ...

  10. python代理池的构建1——代理IP类的构建,以及配置文件、日志文件、requests请求头

    一.整体结构 二.代理IP类的构建(domain.py文件) ''' 实现_ init_ 方法, 负责初始化,包含如下字段: ip: 代理的IP地址 port:代理IP的端口号 protocol: 代 ...