反射学习记

作者 : admin 本文共3075个字,预计阅读时间需要8分钟 发布时间: 2024-06-17 共1人阅读

目录

1.反射基础:

2.类加载的过程:

3.Java 中的反射是什么意思?有哪些应用场景?

4.反射的优缺点?

5.Java 中的动态代理是什么?有哪些应用?


1.反射基础:

1.反射概述:解剖class对象的一个技术
2.能解剖class对象的啥呢?
                   a.解剖出成员变量 : 赋值
                   b.解剖出成员方法: 调用
                   c.解剖出构造方法: new对象

3.用反射的好处:

                让代码变的更通用,更灵活
4.反射,最开始的一步是什么
                 获取Class对象
5.class对象:

                class文件对应的对象
  class类:

                描述class对象的类叫做class类

2.类加载的过程:

Java中Class对象的原理主要与反射机制紧密相关。反射机制允许Java程序在运行时调用Reflection API来获取任何类的内部信息,比如成员变量、构造器、成员方法等,并能操作类的实例对象的属性以及方法。

当JVM加载一个类时,它会在堆内存中产生该类的一个Class对象。这个Class对象包含了类的完整结构信息,因此通过它,我们可以得到类的完整结构信息。这个Class对象就像是一面镜子,通过它,我们可以清楚地看到类的结构信息。

具体来说,Class对象保存了每个类型运行时的类型信息,如类名、属性、方法、父类信息等。每个类在JVM中只对应一个Class对象,保证了Class对象的唯一性。一旦类被加载到了内存中,那么不论通过哪种方式获得该类的Class对象,它们返回的都是指向同一个Java堆地址上的Class对象引用。

因此,当我们使用类名.class这种语法时,实际上是获取了该类对应的Class对象,这个对象为我们提供了对该类进行反射操作的基础。通过这个Class对象,我们可以进行如创建类的实例、调用类的方法、访问类的字段等各种反射操作。

反射学习记插图

获取Class类

  • Class.forName(“类的全路径”);
  • 类名.Class
  • 对象名.getClass();
  • 包装类.TYPE
  • Class类.getSuperClass();

Class类常用方法

调用Class的方法一般会返回三个对象

  • Field对象:存放获取对象的成员变量属性
  • Method对象:存放获取对象的方法
  • Constructor对象:存放获取对象的构造方法
  • 获取成员变量
    getFields()//获取所有公开的成员变量,包括继承变量

    getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量

    getField(变量名)//获取指定公共属性的Field对象

     getDeclaredField(变量名)//获取指定包括私有,不包括继承的Field对象

  • 获取成员方法
    getMethods()//获取所有可见的方法,包括继承的方法

    getMethod(方法名,参数类型列表)//获取指定方法的Method对象
    getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
    getDeclaredMethod(方法名,int.class,String.class)//获取指定包括私有,不包括继承的Method对象

  • 获取构造方法
    getConstructor(参数类型列表)//获取公开的构造方法
    getConstructors()//获取所有的公开的构造方法
    getDeclaredConstructors()//获取所有的构造方法,包括私有
    getDeclaredConstructor(int.class,String.class)//获取指定包括私有,不包括继承的Constructor对象

3.Java 中的反射是什么意思?有哪些应用场景?

每个类都有⼀个
Class
对象,包含了与类有关的信息。当编译⼀个新类时,会产生一个同名的
.class
文件,该⽂件 内容保存着 Class
对象。

类加载相当于
Class
对象的加载,类在第⼀次使用时才动态加载到
JVM 中。也可以使用 Class.forName(“com.mysql.jdbc.Driver”) 这种方式来控制类的加载,该⽅法会返回⼀个 Class
对象。

反射可以提供运⾏时的类信息,并且这个类可以在运⾏时才加载进来,甚至在编译时期该类
.class
不存在也可以加载进来。

Class

java.lang.reflect
⼀起对反射提供了⽀持,
java.lang.reflect
类库主要包含了以下三个类:


1

Field :可以使用 get() 和
set()
方法读取和修改
Field
对象关联的字段;


2)Method :可以使用 invoke() 方法调用与 Method 对象关联的⽅法;


3

Constructor :可以用 Constructor 创建新的对象。

应⽤举例:⼯⼚模式,使用反射机制,根据全限定类名获得某个类的 Class
实例。

List
<
String
>
list
=
new
ArrayList
<
String
>
();

通过反射可以获得什么

c.getClass( )//获得包名,类名

c.getSimpleName( )//获得简单的类名

c.getFields()//获得类的字段,公共字段 ----- public

c.getDeclareFields( )//获得类的字段,所有字段-----包括private

c.getDeclareField("name")//获取指定获取类的字段

c.getMethods()//获取类的方法-----公共的

c.getDeclaredMethod()//获取类的方法,所有的-----包括private

c.getMethod("getName",null)//第二个参数即为方法的属性,没有参数则为null

c.getMethod("setName",String.class)//有参数,则为参数的类型

总结:反射可以获取正在运行程序的任意类的内部信息

4.反射的优缺点?

优点:

运⾏期类型的判断,
class.forName()
动态加载类,提高代码的灵活度;

缺点:

尽管反射⾮常强⼤,但也不能滥用。如果⼀个功能可以不用反射完成,那么最好就不⽤。在我们使⽤反射技术时,

下⾯⼏条内容应该牢记于⼼。


1
)性能开销 :反射涉及了动态类型的解析,所以
JVM ⽆法对这些代码进行优化。因此,反射操作的效率要⽐那些非反射操作低得多。我们应该避免在经常被执⾏的代码或对性能要求很高的程序中使用反射。

(2)安全限制 :使用反射技术要求程序必须在⼀个没有安全限制的环境中运行。如果⼀个程序必须在有安全限制的环境中运⾏,如 Applet
,那么这就是个问题了。


3)内部暴露:由于反射允许代码执行⼀些在正常情况下不被允许的操作(⽐如:访问私有的属性和⽅法),所 以使⽤反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。反射代码破坏了抽象性,因 此当平台发⽣改变的时候,代码的行为就有可能也随着变化。

5.Java 中的动态代理是什么?有哪些应用?

动态代理:当想要给实现了某个接口的类中的方法,加⼀些额外的处理。比如说加日志,加事务等。可以给这个类 创建⼀个代理,故名思议就是创建⼀个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了 额外处理的新功能。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应⽤:
Spring

AOP
、加事务、加权限、加日志。

本站无任何商业行为
个人在线分享 » 反射学习记
E-->