什么是反射

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

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

JAVAclass对象生成:

比如,如今在Test包下有个User类。

1、User.class   //返回值是Class<User>
2、new User().getClass() //返回值是Class<?>,若想得到User类型需要强制转换
3、Class.forName("test.User") //返回值是Class<?>,若想得到User类型需要强制转换 所以1是编译时加载,2,3是运行时加载

插曲:Class类介绍

  Class是一个类,位于java.lang包下。
  在Java中每个类都有一个相对应的Class类的对象,换句话说:Java程序在启动运行时 一个XXX.java类经过编译生成XXX.class文件后,就会在JVM虚拟机中产生一个XXX类对应的Class类的对象,用于表示这个XXX类的类型信息。

通过class对象获取类名,构造函数,属性,方法和一些其他方法:

一,获取类名:

System.out.println("获取全限定类名:\t" + userClass.getName());
System.out.println("获取类名:\t" + userClass.getSimpleName());

二,获取构造函数:

  获取了构造函数,就可以去创建其对象了

User.class.getConstructors()://返回Constructor<?>对象,获取类中的公共构造方法
User.class.getConstructor(Class[] params): //若参数为User.Class返回Constructor<User>对象,获取类的特定公共构造方法,params参数指定构造方法的参数类型
User.class.getDeclaredConstructors()://返回Constructor<?>对象, 获取类中所有的构造方法(public、protected、default、private)
User.class.getDeclaredConstructor(Class[] params): //若参数为User.Class返回Constructor<User>对象,获取类的特定构造方法,params参数指定构造方法的参数类型

注:getConstructors()与getDeclaredConstructors()区别:

  getConstructors()返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造器。

  getDeclaredConstructors()这个方法会返回制定参数类型的所有构造器,包括public的和非public的,当然也包括private的。

三,实例化:

 

System.out.println("实例化:\t" + userClass.newInstance());
System.out.println("实例化:\t" +userClass.getConstructor(User.Class).newInstance());

四,获取属性:

  

User.class.getFields(): //获取类中public类型的属性,包括父类中的字段
User.class.getField(String name):// 获取类特定的方法,name参数指定了属性的名称 
User.class.getDeclaredFields():// 获取类中所有的属性(public、protected、default、private),但不包括继承的属性。
User.class.getDeclaredField(String name): //获取类特定的方法,name参数指定了属性的名称

五,获取方法:

 

User.class.getMethods(): //获得类的public类型的方法
User.class.getMethod(String name, Class[] params): //获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型
User.class.getDeclaredMethods(): //获取类中所有的方法(public、protected、default、private)
User.class.getDeclaredMethod(String name, Class[] params): //获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型

注:在获取private属性和方法时

// 取消安全性检查,设置后才可以获取或者修改private修饰的属性,也可以单独对某个属性进行设置
Field.setAccessible(fields, true);
// 取消安全性检查,设置后才可以调用private修饰的方法,也可以单独对某个方法进行设置
     Method.setAccessible(methods, true);

 六,其它重要方法:
      

forName(String className): //获取className参数指定的类的class对象
forName(String className,boolean initialize,ClassLoader): //使用指定的类加载器获取className参数指定的类的class对象
getClassLoader(): //获取类加载器
getPackage(): //获取类所在的包名

 发现一:

  

if(new User().getClass()==User.class) {  

        System.out.println("equal");  

}  else {  

          System.out.println("unequal");
}
//结果输出equal,将其中一侧换成Class.forName("test.User")也时equal

证明三种获取class类对象方法获取的对象是同一个!

参考文献:https://www.cnblogs.com/xinhuaxuan/p/6019497.html

     https://www.cnblogs.com/zhaoguhong/p/6937364.html

     https://www.cnblogs.com/xinhuaxuan/p/6019497.html

Java反射机制集中学习的更多相关文章

  1. Java反射机制的学习

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

  2. Java反射机制简单学习

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

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

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

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

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

  5. Java反射机制的简单学习

    今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...

  6. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  7. Java基础学习总结(75)——Java反射机制及应用场景

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

  8. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

  9. Java反射机制学习

    Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...

随机推荐

  1. 洛谷P3711 仓鼠的数学题(伯努利数+多项式求逆)

    题面 传送门 题解 如果您不知道伯努利数是什么可以去看看这篇文章 首先我们把自然数幂和化成伯努利数的形式 \[\sum_{i=1}^{n-1}i^k={1\over k+1}\sum_{i=0}^k{ ...

  2. iis 重启命令

    打开IIS配置窗口的CMD命令:开始---运行---CMD----输入inetmgr  直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS 重启IIS服务器,开始->运行 ...

  3. python基础之内建函数(二)

    (7)max() 函数:返回列表.元祖或字符串中最大的元素,注意:字母“大于”数字.小写字母“大于”大写字母(字母排序是根据ASCII码表排的) 例如: >>>num = list ...

  4. django中给ajax提交加上csrf

    代码来自djangoproject网站 在html中的script标签下插入下面代码 在html文档加载时候运行下面代码,并且使用$.ajaxSetup设置ajax每次调用时候传入的数据,$.ajax ...

  5. php 对象的自定义遍历

    php对象的自定义遍历 对手册中的案例进行分析 更好的理解foreach() 的遍历步骤 class myIterator implements Iterator { private $positio ...

  6. Springboot 整合 中国移动MAS HTTP1.0 实现短信发送服务(二)

    原因:身份验证传入的参数包含中文企业名,因为本地编码格式是支持中文的:而客户的服务器中文却乱码,导致传给中国移动MAS服务器的是乱码的信息. 解决:非常简单,将中文信息转为UTF-8.例如(%E5%8 ...

  7. C++_异常4-将对象用作异常类型

    通常,引发异常的函数将传递一个对象.这样做的重要优点之一就是,可以利用不同的异常类型来区分不同的函数在不同的情况下引发的异常. 对象可以携带信息,程序员可以根据这些信息来确定异常的原因. 同时,cat ...

  8. 洛谷 P4093 [HEOI2016/TJOI2016]序列(Cdq+dp)

    题面 luogu 题解 \(Cdq分治+dp\) \(mx[i],mn[i]\)分别表示第\(i\)位最大,最小能取到多少 那么有 \(j < i\) \(mx[j] \le a[i]\) \( ...

  9. HDU_1028 Ignatius and the Princess III 【母函数的应用之整数拆分】

    题目: "Well, it seems the first problem is too easy. I will let you know how foolish you are late ...

  10. WSH的SpecialFolders对像

    前面我做过一个VBS,来实现添加网站快捷方式到开始菜单,当然你也可以添加到别的地方,这就是那个对像的一些用法返回 SpecialFolders 对象(特殊文件夹集). object.SpecialFo ...