全面了解全面了解Java反射机制反射机制
Java的反射机制在实践中可谓无处不在,如果你已经工作几年,还对Java的反射机制一知半解,那么这篇文章
绝对值得你读一读。
什么是反射什么是反射
反射 (Reflection) 是Java的特征之一,它允许运行中的Java程序获取自身的信息,并且可以操作类或对象的内部属性。
通俗的来讲就是:通过反射机制,可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。
注意这里的重点是:运行时,而不是编译时。我们常规情况下写的对象类型都是在编译期就确定下来的。而Java反射机制可
以动态地创建对象并调用其属性,这样创建对象的方式便异常灵活了。
虽然通过反射可以动态的创建对象,增加了灵活性,但也不是什么地方都可用,还要考虑性能、编码量、安全、面向对象性
等。
我们知道Java是面向对象的,如果通过反射机制去操作对象里面的属性或方法,一定程度上破坏了面向对象的特性。同时,
通过反射机制还可以修改私有变量,也存在一定的安全性问题。
但这并不影响反射在实践中的应用,几乎各大框架多多少少都在使用Java反射机制。特别是主流的Spring框架。
功能及用途功能及用途
Java反射主要提供以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
在运行时调用任意一个对象的方法
反射最重要的用途之一就是开发各类通用框架。以Spring为例,当基于XML进行配置Bean时,我们通常写如下代码:
<bean class="com.choupangxia.UserServiceImpl">
</bean>
Spring在启动的时候便会利用反射机制去加载对应的UserServiceImpl类,然后进行实例化。如果不存在该类则会抛出异常,
通常异常中还会出现invoke方法调用的堆栈信息。
当Spring基于注解去实例化对象时,同样利用的是反射机制。下面通过一个简单demo示例,演示一下如何通过反射获得注解
信息:
static void initUser(User user) throws IllegalAccessException {
// 获取User类中所有的属性(getFields无法获得private属性)
Field[] fields = User.class.getDeclaredFields();
// 遍历所有属性
for (Field field : fields) {
// 如果属性上有此注解,则进行赋值操作
if (field.isAnnotationPresent(InitSex.class)) {
InitSex init = field.getAnnotation(InitSex.class);
field.setAccessible(true);
// 设置属性的性别值
field.set(user, init.sex().toString());
System.out.println("完成属性值的修改,修改值为:" + init.sex().toString());
}
}
}
更多关于Java反射的例子我们就不多说了。上面的示例现在看不懂也没关系,下面我们就来详细介绍一下Java反射机制的具
体使用。
简单示例简单示例
我们通过一个简单的示例对比,来了解一下Java反射机制。首先来看正常情况下创建对象并使用对象的示例:
User user = new User();
user.setUsername("公众号:程序新视界");
user.setAge(3);
评论0
最新资源