当前位置:首页 > Java技术 > Java反射的作用与用法

Java反射的作用与用法

2022年08月05日 21:56:48Java技术4

那么什么是Java的反射呢?

       大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。

Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。

那么Java反射有什么作用呢?

假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。

Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。大家都用过Jcreator和eclipse。当我们构建出一个对象的时候,去调用该对象的方法和属性的时候。一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。

Class类

       要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。

上半部分转自这里

Class类的使用

        面向对象,万事万物皆对象。

        java语言中,两种不面向对象:静态的成员、普通数据类型类 

       静态的成员       属于类
       普通数据类型      有包装类弥补    

        类是对象,类是java.lang.Class类的实例对象。

任何一个类都是Class的实力类。

Class类由java virtual machine虚拟机创建。

Class类获取的实例对象表示了实例类的类类型(Class type)

        Class类动态加载类的使用

        动态加载:运行时刻加载类 Class.forName("类的名称");  优点:用的时候调用不影响程序运行。

        静态记载:编译时刻加载类 new创建对象是静态加载类。

用动态加载的方法实例化多个相似类,可以创建一个接口,让这些相似类实现这个接口,只创建这个接口类的对象即可。

使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。     详见java中newInstance()和new()的区别

        Java获取方法信息

        

方法的反射

        方法反射的操作:method.invoke(对象,参数列表)  当然前提是获取到方法。

        1.获取类的信息首先要获得类的类类型  获取class对象。  A   a = new A();             Class  c = a.getClass();

        2.方法获取:名称和参数来决定 getMethod获取public方法 getDelcaredMethod自己声明的方法

                                 Method   m=c.getMethod("方法名",参数列表);

        方法的反射操作是用m对象来进行方法调用的  本来有a1.print(参数列表);可以进行调用。方法的反射和这个调用的效果完全相同 

通过Class,Method来认识泛型的本质

         Java中集合的泛型,是防止错误输入,只在编译阶段有效,绕过编译就无效了。。。例如创建一个String泛型的ArrayList,当向其中添加其他类型数    据时会提示错误。

         可以通过方法的反射绕过编译添加数据

  
    
  1.   ArrayList<String>  list = new ArrayList<String>();  
  2.   Class c=list.getClass();
  3.   Method m=c.getMethod("add",Object.class);    
  4.   m.invoke(list,参数数据);

        但结果是不能用for-each进行遍历不然抛异常类型转换错误

             

作者:AntaoMen
来源链接:https://blog.csdn.net/AntaoMen/article/details/72626157

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/18039.html

分享给朋友:

“Java反射的作用与用法” 的相关文章

java反射的应用(Hibernate)

java反射的应用(Hibernate)          Hibernate是一个屏蔽了JDBC,实现了ORM的java框架,利用该框架我们可...

利用JAVA反射,读取数据库表名,自动生成对应实体类

本代码是利用java反射,读取数据库表自动根据表名生成实体类,数据库采用老牌SQLSERVER 2000,驱动为JTDS,其他数据库可根据情况自定修改。 代码中包含了大部分数据库类型与JAVA类型的转换,少数未包含进去的会在生成代码时打印出来,方面后期查找修改。 本文...

java反射机制及Method.invoke方法(转载)

java反射机制及Method.invoke方法(转载)

1.java反射机制主要提供了以下功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法 Reflection 是Java被视为动态(或准动态)语言的一个关...

Java反射机制及用途

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; class.forName(类名)//获得类      这种动态获取的信息以及...

Java反射,注解,以及动态代理

Java反射,注解,以及动态代理

Java反射,注解,以及动态代理 基础  最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧【如有错误,望指正】...

Java基础--反射机制的知识点梳理

什么是反射?   正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法等,反射可以通过加载类,解剖出类的各个组成部分. 为什么要用反射?...

java反射机制详解

java反射机制详解

一、什么是反射 JAVA反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 想要使用反射机制,就必须要先获取到该类的字节码文件对象(...

Java反射应用-遍历一个对象的属性和值

本文是Java反射的一个常见的案例,常见的情况是,给到一个对象,需要把对象的每个属性和值重新生成一个Map或者Array,这个时候就是要要到反射啦,不多说,上干货: public static ArrayList<NameValuePair> getObjNam...

Java反射获取字段、设置字段以及获取字段的值

Java反射获取字段、设置字段以及获取字段的值 获取字段 1.先找到字段所在类的字节码 2.找到需要被获取的字段 Class类中获取字段: public Field[] getFields();//获取包括自身和继承(实现)过来的所有的public字...

java反射遍历实体的所有属性名称和值

import java.lang.reflect.Field; import java.lang.reflect.Method; // model换成需要遍历的实体 // 获取实体类的所有属性,返回Field数组...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。