码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA反射机制

时间:2017-08-17 14:34:06      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:多少   一个   存在   调用   strong   tor   信息   获取   函数   

 

       Java反射机制是在运行状态中,对于任意一个类(class文件),都能知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个属性和方法。这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制简单理解为动态获取类中的信息就是Java反射。

实际上是对类的解剖。那么要想对字节码文件进行解剖。必须要获取字节码文件对象。那么如何获取字节码文件对象呢?

有如下三种方式

  • 通过Object对象的getClass()方法,此方法需要明确具体的类,并且要创建该类的对象,比较麻烦
  • 通过类名.class, 例如User.class,Person.class,这种方式相比第一种简单点,不过还是要明确类中的静态成员,不够扩展
  • 通过Class.forName("完整的类名");这种方法比较方便,扩展性很强。

下面来介绍Class对象中的常用的一些方法

1.获取构造函数

  • Constructor[] getConstructor(Class<?>...parameterTypes);返回此class对象对应类的、带指定形参列表的public构造器
  • Constructor getConstructors();返回此class对象对应类的所有public构造器
  • Constructor[] getDeclaredConstructor(Class<?>...parameterTypes);返回此class对象对应类的、带指定形参列表的构造器,与构造器的访问权限无关
  • Constructor[] getDeclaredConstructors();返回此class对象对应类的所有构造器,与构造器的访问权限无关

2.获取成员方法

  • Method getMethod(String methodName,Class<?>...parameterTypes) 返回此class对象对应类的、带指定形参列表的public方法
  • Method getMethods() 返回此class对象对应类的所有public方法
  • Method getDeclaredMethod(String methodName,Class<?>...parameterTypes) 返回此class对象对应类的、带指定形参列表的方法,与方法的访问权限无关
  • Method getDeclaredMethods() 返回此class对象对应类的所有方法,与方法的访问权限无关

3.获取成员变量

  • Field getField(String name) 返回此class对象对应类的、指定名称的public成员变量。
  • Field getFields() 返回此class对象对应类的所有public成员变量。
  • Field getDeclaredField(String name) 返回此class对象对应类的、指定名称的成员变量。与成员变量的访问权限无关
  • Field getDeclaredFields() 返回此class对象对应类的所有成员变量。与成员变量的访问权限无关

 

4.小细节

  •  通过Class对象的newInstance()方法可以用来创建对象,不过它默认调用的是无参的构造函数,当然我们想要创建指定参数的对象,可以通过构造器来创建,调用其newInstance方法
  •  这里也要注意构造器的访问权限,私有的不能直接调用newInstance方法创建
  •  通过Field的 set(Object obj,Object value)和 get(Object obj)可以设置成员变量的值和获取到成员变量的值。这里也要注意成员变量的访问权限,如果是private的不具备访问权限。这里可以通过
  •  setAccessible(true)来暴力访问
  •  通过Method的invoke(Object obj,String methodName)可以动态的调用方法,同样也要注意方法的访问权限。私有的方法可以通过设置setAccessible(true)来暴力访问
  •  通过class对象的getName()可以获取到完整的类名
  •  通过class对象的getSimpleName()可以获取到简写类名
  •  通过class对象的getPackage()获取到此类的包

 5.注意

  •  Java提供的反射机制随便很方便的帮助我们动态获取类中的信息,但是也存在一些缺点:
  •  丧失了编译时期类型检查的好处,包括异常检查,如果程序企图用反射的方式调用不存在的方法或者不可访问的方法,在运行时它会失败,除非用了比较好的预防措施
  •  执行反射访问所需要的代码非常笨拙和冗长,编写这样的代码阅读性较差
  •  性能损失,反射方法调用比普通方法调用慢了许多,具体慢多少受到各个因素的影响。

JAVA反射机制

标签:多少   一个   存在   调用   strong   tor   信息   获取   函数   

原文地址:http://www.cnblogs.com/lilinjie/p/7381081.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!