(之前这篇文章写过了,不知道为什么发表的时候报了404错误,导致心情不好,又重新写的。)

先来一段百度百科的关于反射的定义:




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

JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言
<https://baike.so.com/doc/824914-872436.html>
"。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods


在java中反射是很重要的,在现在的很多框架中也都运用了反射的概念,比如spring中的aop机制就是利用反射原理,动态代理,其实说起动态代理就必须要说反射。在写java我们使用对象的时候一般都是使用new的方式来创建对象,这些将要在程序中使用的对象在编译期间都已经知道了,但是编译期间和运行期间还不一样。假如有类Person,Student类extends了Person(都有空构造函数),Person
person=new
Stuednt();在编译的时候person是Person类型的,但是在运行的时候确实Student的,有时候我们在程序运行期间根据类去生成相应的对象然后进行一系列的操作,这就是反射,所谓的反射个人理解就是在JVM运行期间通过查找到相应的类,通过类获取其属性以及方法来创造对象。

通过反射创造类的方式有一下方式:

有类Person

package com.tlc.Person;

public class Person{

private String name;

private String sex;

private Integer age;

public Person(){};

public Person(String name,String sex,Integer age){

    this.name=name;


    this.sex=sex;


    this.age=age;


    }

};

①:Person person=new Person();Class clazz=person.getClass();

②:Person person=new Person();Class clazz=person.class;

③:Class clazz=Class.formName("com.tlc.Person");

前两种都是通过获取对象的方式来获取Class类,在实际中假如需要使用反射一般都不会使用前两种,而是使用第三种的Class的静态方法来获取。


获取到class对象之后可以创建实例,查看源码可以知道使用newInstance()或者newInstance(Object....params)分别介绍一下这两种方式,如果没有那种必须要在构造函数中初始化数据的要求,一般使用newInstance()即可够用。

①:使用newInstance()方式类中必须要有默认的空构造函数或者显示的空构造函数Person
person=(Person)clazz.newInstance(),如果没有空的构造函数会报错。

②:使用带参数的构造函数必须要获取到对应的构造函数,这里给大家推荐另外一篇博文:获取构造函数
<https://blog.csdn.net/tanlicheng1/article/details/80550661>

Constructor constructor=clazz.
getConstructor(Class<?>...ParametersType),必须要有这种参数顺序的构造函数否则就会这偶不到报错,Person
person=constructor.newInstance()或者通过有参构造函数来获取即Person
person=constructor.newInstance(name,sex,age);对于对象的操作肯定就是对属性的赋值和读取操作了,这时候就要获取其filed,可以通过如下的操作的方式获取以及操作filed,参考此篇博文:
操作类的field <https://blog.csdn.net/tanlicheng1/article/details/80549603>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信