java反射

本文介绍了Java的反射机制,包括反射的作用、Class类、获取Class对象的方式、通过反射创建类对象、访问类属性和方法、调用任意方法以及比较Class对象等。通过反射,可以在运行时动态地获取类信息和操作对象,提供了强大的灵活性。
摘要由CSDN通过智能技术生成

1.什么是Java的反射呢?

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

反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法

2.Java反射有什么作用呢?

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

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

3.Class类

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

4.获取class类对象

既然class对象如此重要,那么我们如何获取class对象呢?这里有三种方法:

4.1 使用类对象的getClass()方法

  • 使用类对象getClass()方法

4.2 Class.forName(classname)

  • 使用 Class.forName(classname) 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象
  • 如果className不是类名或接口名,则forname抛出一个checked exception异常所以应该给这个方法提供一个异常处理器

4.3 .class 方法

5.通过反射创建类对象

  • 既然通过上文我们知道了如何获取class对象,那么我们是不是就可以根据这个类对象来创建实例对象呢?当然可以
  • 通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法

5.2 Constructor 对象的 newInstance() 方法

  • 通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。
  • 这里getConstructor和newInstance使用时需要设置异常处理,我这里是直接在main后面throws了

6.获取类属性、方法、构造器的结构

  • 我们已经成功获取了class类对象,并学会了如何创建对象,现在我们还可以看看对象内部的结构是什么样的,比如属性、方法和构造器。
  • 在java.lang.reflect 包中有三个类 Field、Method 和 Constructor分别用于描述类的属性、 方法和构造器
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

下面介绍一下 Field、Method 和 Constructor三个类的常用方法

  • Field类的getType 方法, 用来返回属性所属类型的 Class 对象
  • Method 类有一个getReturnType方法,返回return值所属类型的Class对象
  • Method 和 Constructor 类有一个共同的方法getParameterTypes,返回方法参数所属类型的Class对象
  • Field、Method 和 Constructor都有一个getName 方法,返回方法名的字符串
  • Field、Method 和 Constructor都有一个getModifiers方法,它将返回一个整型数值,用不同的位开关描述 public 和 static 这样 的修饰符使用状况。可以利用 Modifier.toString方法将 修饰符打印出来。
  • for (Method m : methods) {
  • String modifiers = Modifier.toString(m.getModifiers());
  • }

该修饰符是java.lang.reflect.Modifier的静态属性。这里是用十进制表示的,源码里面是十六进制表示的。
对应表如下:
PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048

  • 可以使用Modifiei类中的 isPublic、 isPrivate 或 isFinal 判断方法或构造器是否是 public、 private 或 final
  • Class类中的 getFields、 getMethods 和 getConstructors方 法将 分 别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值