一.反射定义&通俗理解

  反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
  反射提供了一种运行期获取对象元信息的手段。写框架代码用的比较多,因为需要运行时动态获取和操作对象的属性和方法。尽量少用反射,会有性能开销,大多数场景下可以用设计模式代替。即:根据类的信息来加载这个类,然后构造这个对象,然后再调用这个类中的属性和方法。

二.反射好处,是为了解决什么问题存在的呢?

Java反射的作用:
  在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
Java 反射机制主要提供了以下功能

  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法

三.反射涉及的类库在java包里在哪里,都有哪些方法呢

Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;
其中class代表的时类对象,
Constructor-类的构造器对象,
Field-类的属性对象,
Method-类的方法对象。
通过这四个对象我们可以粗略的看到一个类的各个组 成部分。

1.Class

  其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。应用反射时我们最关心的一般是一个类的构造器、属性和方法。

java中主要是通过四种方式来进行class的加载的:
1.classLoader
2.类名.class.
3.对象名.getClass()
4.Class.forName();
我个人觉得1、4是比较常用的,因为这两个可以通过类的信息找到类,进而将类加载的JVM中。你只需传递给他们字符串就ok。

获取Class对象的方式:

方式一:通过Object类的getClass()方法取得,基本不用:

packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Person per = newPerson() ; // 正着操作
Class<?> cls = per.getClass() ; // 取得Class对象
System.out.println(cls.getName()); // 反着来
}
}

方式二:使用“类.class”取得,在日后学习Hibernate开发的时候使用

packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Class<?> cls = Person.class; // 取得Class对象
System.out.println(cls.getName()); // 反着来
}
}

方式三:使用Class类内部定义的一个static方法,主要使用取得Class类对象:public static Class

forName(String className) throws ClassNotFoundException;
packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Class<?> cls = Class.forName("cn.mldn.demo.Person") ; // 取得Class对象
System.out.println(cls.getName()); // 反着来
}
}

通过Class对象获取实例化对象

范例:通过反射实例化对象

packagecn.mldn.demo;
classPerson {
@Override
publicString toString() {
return"Person Class Instance .";
}
}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Class<?> cls = Class.forName("cn.mldn.demo.Person") ; // 取得Class对象
Object obj = cls.newInstance() ; // 实例化对象,和使用关键字new一样
Person per = (Person) obj ; // 向下转型
System.out.println(per);
}
}

  那么现在可以发现,对于对象的实例化操作,除了使用关键字new之外又多了一个反射机制操作,而且这个操作要比之前使用的new复杂一些,可是有什么用?
  对于程序的开发模式之前一直强调:尽量减少耦合,而减少耦合的最好做法是使用接口,但是就算使用了接口也逃不出关键字new,所以实际上new是造成耦合的关键元凶。

  以上只是利用了Class类作为了反射实例化对象的基本应用,但是对于一个实例化对象而言,它需要调用类之中的构造方法、普通方法、属性,而这些操作都可以通过反射机制完成。

2.Constructor

得到构造器的方法
Constructor getConstructor(Class[] params) – 获得使用特殊的参数类型的公共构造函数,

Constructor[] getConstructors() – 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) – 获得使用特定参数类型的构造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() – 获得类的所有构造函数(与接入级别无关)

3.Field

获得字段信息的方法
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)

Field[] getDeclaredFields()

4.Method

获得方法信息的方法
Method getMethod(String name, Class[] params) – 使用特定的参数类型,获得命名的公共方法

Method[] getMethods() – 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) – 使用特写的参数类型,获得类声明的命名的方法

Method[] getDeclaredMethods() – 获得类声明的所有方法

四.我写的一个小demo:

/*** Created by annuoaichengzhang on 16/4/14.*/class Person {private String name;private String age;public Person() {}public Person(String name, String age) {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}
}public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {// 正者操作Person person = new Person();Class<? extends Person> personClass = person.getClass();System.out.println(personClass.getName());// 输出结果:reflect.PersonClass<Person> personClass1 = Person.class;System.out.println(personClass1.getName());// 输出结果:reflect.PersonClass<?> aClass = Class.forName("reflect.Person");Object object = aClass.newInstance();Person person1 = (Person) object;System.out.println(person1);// 构造函数相关Constructor<?> constructor = aClass.getConstructor(String.class, String.class);Object object3 = constructor.newInstance("张三", "20");System.out.println(object3);// 全部属性Field[] fields = aClass.getDeclaredFields();for (int i = 0; i < fields.length; i++) {System.out.println(fields[i]);}Field name = aClass.getDeclaredField("name");name.setAccessible(true);name.set(object3, "张三");System.out.println(name.get(object3));// 方法Method[] methods = aClass.getMethods();for (int i = 0; i < methods.length; i++) {System.out.println(methods[i]);}Method setName = aClass.getMethod("setName", String.class);Method getName = aClass.getMethod("getName");setName.invoke(object3, "张四");System.out.println(getName.invoke(object3));}}

更多资料:
http://a.codekk.com/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%20Java%20%E5%8F%8D%E5%B0%84%20Reflection

java夯实基础系列:反射相关推荐

  1. Java零基础系列003——变量

    Java零基础系列003--变量 //变量(variable):程序中最基本的存储单元,包括变量名.类型.作用域 //变量应该先声明,只有声明后系统才会为其分配相应长度的存储空间,变量实质上就是存储单 ...

  2. Java零基础系列001——第一个程序

    Java零基础系列001--第一个程序 public class Welcome {public static void main(String[] args) {//args为arguments的缩 ...

  3. 【FFT夯实基础系列】手写笔记合集|傅里叶级数、傅里叶变换

    B站up主@mazonex推出的宝藏系列视频课笔记 因为是数学类的,所以笔者采用了手写并导出的形式 这一篇合集包括了up主[傅里叶夯实基础系列]视频的P1-P6,可以通过上方链接看具体视频 目录 傅里 ...

  4. java夯实基础-基本数据类型

    学习任何一门语言,基础永远都是最重要的.本文测试java中八种基本数据类型(int,short,long,float,double,char,boolean,byte),包括其占用空间大小,能够存储的 ...

  5. java j_Javaj基础之反射

    反射概述 问题:我们平时书写在idea中的Java程序是如何运行的呢? 1)首先将 .java 源文件编译为class类文件: 2)编译后的类文件是存在硬盘中的,那么我们运行需要在内存中看到效果,那么 ...

  6. JavaScript夯实基础系列(四):原型

      在JavaScript中有六种数据类型:number.string.boolean.null.undefined以及对象,ES6加入了一种新的数据类型symbol.其中对象称为引用类型,其他数据类 ...

  7. java夯实基础:final脑图

    final的作用从两个方面理解:基本的锁定功能,帮助JVM实现效率和安全.关于final的解释非常多,本文仅做整理的总结. 基本用法:锁定 final的锁定功能通过final修饰的对象来具体实现,fi ...

  8. JavaScript夯实基础系列(二):闭包

      在JavaScript中函数是一等公民.所谓一等公民是指函数跟其他对象一样,很普通,可以进行把函数存在数组中.作为参数传递.赋值给变量等操作.当函数作为另一个函数的返回值在外部调用时,跟该函数在函 ...

  9. JAVA重要基础之反射

    什么是反射? 答:在JVM运行阶段,能够动态地获取信息(字节码实例.构造器.方法.字段),动态地进行对象的创建,方法执行,字段操作. 反射常用的类: (1)Class:所有类的字节码实例描述 (2)C ...

最新文章

  1. 员工执行不力,换人还是换制度?
  2. jquery easyui datagrid getSelections用法
  3. 搭建视频网站的技术方案
  4. 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出...
  5. php文件上传实验总结,php文件上传总结 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 由中国银联主导和推行的“盒子支付模式”正式推出多平台应用
  7. word图片另存为变黑色_Word的图片另存为图片格式的方法
  8. 08python excel一键式统计0.11版本修正利息收入费用正负表达问题
  9. vscode更改背景颜色
  10. 呕心沥血大放血,今天小企鹅来给大家送福利了!!!Mac.Win.Lin虚拟机映像/资源超全[分享]
  11. 关于idea debug step into不进入class文件或者自己想要略过的一些文件设置
  12. php添加数据数据库乱码,php添加数据数据库乱码
  13. 计算机位置不可用d 桌面,win7系统D: 文档desktop引用了一个不可用的位置怎么办...
  14. Turtle图形绘制(绘制奥运五环)
  15. five86-2靶机渗透攻略
  16. python易盾滑动验证码
  17. excel怎么设置打印区域_如何设置打印预览,Excel打印功能介绍
  18. 浙大程序员甘愿放弃三万月薪跑滴滴,自称开心比什么都好
  19. 让大数据落地的正确姿势
  20. 别人Python都玩腻了,而你却连安装工具库都搞不清楚?

热门文章

  1. 理性行为理论和计划行为理论
  2. matlab怎样删除全部NAN值
  3. 月薪过万算中产吗?别听专家忽悠,算清这8本账:你这是骂我
  4. 字典树(Trie树)两种实现方式详解
  5. 文件删除不了的解决办法
  6. python怎么在画布上写字_python ImageDraw 添加文字
  7. matlab求松弛迭代发,MATLAB实现迭代法最佳松弛因子的选取
  8. 教你如何解决win10电脑局域网看不到其他共享电脑
  9. 微型计算机原理及应用:基于Arm微处理器
  10. SpringCloud系列(2)---Netfilx-Eureka