反射机制

什么是反射

首先大家应该先了解两个概念,编译期运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行。

  • JAVA反射机制是在运行状态中
  • 反射机制允许程序在运行时取得任何一个已知名称的class的内部信息
  • 能够知道这个类的所有属性和方法(即使是私有的)
  • 可以调用它的任意方法和属性,甚至改变属性
  • 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

java如何实现反射

众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。

这个Class 类十分特殊,当一个类被加载JVM 便自动产生一个Class 对象。

的到class有三种方式:

1
2
3
4
5
6
7
8
9
10
11
12
//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
// 类型的对象,而我不知道你具体是什么类,用这种方法
  Person p1 = new Person();
  Class c1 = p1.getClass();

//2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
// 这说明任何一个类都有一个隐含的静态成员变量 class
  Class c2 = Person.class;

//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
// 但可能抛出 ClassNotFoundException 异常
  Class c3 = Class.forName("com.ys.reflex.Person");

Class类提供了大量的实例方法来获取该Class对象所对应的详细信息,我们只是做简单的介绍,详细请参考JDK文档,这边提供一个在线的中文文档给大家如下:

这边列了下Class类其中的部分方法,

1
2
3
4
5
6
7
8
9
10
11
获取公共构造器 getConstructors()
获取所有构造器 getDeclaredConstructors
获取包含的方法 getMethod()
获取包含的属性 getField(String name)
获取内部类 getDeclaredClasses()
获取外部类 getDeclaringClass()
获取所实现的接口 getInterfaces()
获取修饰符 getModifiers()
获取所在包 getPackage()
获取类名包含包路径 getName()
类名不包含包路径 getSimpleName()

反射的用途

注解的使用:java中注解功能的实现就是通过反射机制

编写基础框架:反射机制是很多java框架的基础,如spring的ioc容器的实现




版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!

本文出自:monkeyGeek

座右铭:生于忧患,死于安乐

欢迎志同道合的朋友一起交流、探讨!

monkeyGeek
#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×