您的位置:首页 > 编程语言 > Java开发

【Java基础】——反射

2018-02-26 11:12 211 查看

前提

在Java的世界里,反射技术已经大行其道,并且通过不断优化,Java的可配置性得到了巨大的提高。

何为反射?

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

Class类

如果需要解剖一个类,必须先要获取该类的字节码对象。反射的基础需要先获取每一个字节码文件对应的class类型的对象。

三种方式如下

//方式一:通过Object类中的getObject
Person p = new Person();
Class c = p.getClass();
//方式二:通过类名.class获取字节码文件对象
Class c2 = Person.class;
//方式三:通过Class中方法
Class c3 = Class.forName("Person");//包名.类名


方式三与前两种方式有根本的区别:前两种方式必须明确Person类型,方式三只需要知道字符串就行了,这种扩展性更强一些,只提供字符串,按配置文件加载就可以了。

通俗一点理解反射就是程序运行时,需要动态的加载一些类这些类可能之前用不到所以不需要加载,而且运行时根据需要才加载。在程序运行的时候我们就不能在通过new的方式去加载,拒绝了硬编码,就需要灵活的配置。所以方式三就是最好的选择方式。

反射实现

反射方式具体实现需要借助四个类:

Class——类对象

Constructor——类的构造器对象

Field——类的属性对象

Method——类的方法对象

//1、构造器的相关方法
Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
Constructor[] getConstructors() -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
//2、获得字段信息的方法
Field getField(String name) -- 获得命名的公共字段
Field[] getFields() -- 获得类的所有公共字段
Field getDeclaredField(String name) -- 获得类声明的命名的字段
Field[] getDeclaredFields() -- 获得类声明的所有字段
//3、获得方法信息的方法
Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
Method[] getMethods() -- 获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods() -- 获得类声明的所有方法


反射实现打印“hello + 姓名”Demo

import java.lang.reflect.Method;

/**
* @author 贾文静
* @DESCRIPTION:$
* @Date:
**/
public class reflect {
public void sayHello(String name) {
System.out.println("hello," + name);
}

public static void main(String[] args) throws Exception{
//reflect.class.getName() 获取reflect的完整类路径
Class<?> classDemo = Class.forName(reflect.class.getName());
//初始化reflect类
Object obj = classDemo.newInstance();
//获取服务方法-sayhello
Method method = obj.getClass().getMethod("sayHello", String.class);
//反射调用方法
method.invoke(obj, "贾文静");
}
}


总结

反射最大的好处让编码变得灵活起来,在一定程度通过动态加载,减少服务器的压力。小编通过demo主要说明一下反射的具体应用。反射在目前最重要的用途就是开发各种通用的框架,为了保证通用性,就需要根据配置文件加载不同的对象和类,调用不同的方法。下篇文章小编给出一个应用配置文件的反射案例。

关于反射推荐如下文章:

深入解析Java反射(1) - 基础

深入解析Java反射(2) - invoke方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: