【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方法
相关文章推荐
- 【java基础 七】反射机制
- 黑马程序员——Java基础---反射
- java基础学习笔记之反射
- java 反射的基础学习
- Java基础之《反射》
- 黑马程序员-java基础加强-反射的深入讲解
- Java反射基础总结
- java基础第九讲——反射、工厂设计模式、注解、线程、网络与线程的结合
- 黑马程序员-java基础(十)-反射、正则表达式
- JAVA基础--JAVA中的反射机制详解
- JAVA 基础 - 反射
- 黑马程序员——Java基础:反射、JDK1.5新特性、正则表达式
- java基础中的反射机制
- 黑马程序员-JAVA基础-反射
- Java基础[5]-2-装箱拆箱;反射和继承设计技巧
- Java基础——反射
- android基础篇------------java基础(5) 类的反射
- Java基础加强<一>_MyEclipse、JDK1.5新特性、枚举、反射
- java基础,关于java反射方法的调用,
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<反射>(二十九)