java中的反射
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的反射相关的知识,希望对你有一定的参考价值。
一、什么是反射
简单来说,java反射机制其实就是I/O流的一种封装版,用来快速读取硬盘上的class文件。class文件相当于一个身份证,JVM在操作某一个对象时,需要根据身份证获得对象拥有的属性和拥有的功能及方法。这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。
二、官方提供的反射机制API:
class文件: java.lang.reflect.Class类:描述内存中class文件
属性(数据存储单位): java.lang.reflect.Field类:描述内存中class文件中属性
方法: 构造方法: java.lang.reflect.Construtcor类:描述内存中class文件构造方法
功能性方法: java.lang.reflect.Method类:描述内存中class文件功能方法
三、加载硬盘上的class文件三种方式:
1、Class.forName();
2、类名.class;
3、对象.getClass();
四、获取内存中类文件包含的属性信息:
Class管理内存中class文件。提供对应方法读取class文件中的属性信息
1、读取仅仅在当前class文件定义的属性的方法:
getDeclaredFields();
2、读取在当前class文件定义的以及从父类中继承而来的公有属性的方法:
getFields();
五、java中反射机制的优缺点:
优点:1、能够在运行时动态获取类的信息,大大地提供里程序的灵活性和扩展性;
2、和动态编译功能相结合,可以实现超强的功能。
缺点:1、比较耗费资源,大幅降低程序运行时的性能;
2、破坏了程序的封装性,可以通过反射来获取某个类的私有属性,相对来说降低了程序的安全性。
总结:任何事物都有其两面性,没有好与坏,能够在不同的场景下灵活运用才是关键。
六、让代码告诉你这一切:
1 package com.bjpowernode.util; 2 3 import java.lang.reflect.Field; 4 5 public class ReflectUtil { 6 /** 7 * 如果当前工程java project:classPath 8 * @param classPath 9 * @throws ClassNotFoundException 10 */ 11 public static void load(String classPath) throws ClassNotFoundException{ 12 Class classObj = Class.forName(classPath); 13 } 14 /** 15 * 一个类在运行期间,只会被加载到内存一次 16 * 此时如何定位内存中的类文件 通知JVM 17 * 到内存中找到studentVo.class文件 18 * @param classObj 19 */ 20 public static void load(Class classObj){ 21 22 } 23 /** 24 * 通知JVM定位当前对象隶属的class文件所在内存中的位置 25 * @param obj 26 */ 27 public static void load(Object obj){ 28 obj.getClass(); 29 } 30 31 /** 32 * 功能:获得当前对象拥有的共有属性 33 * @param obj 34 */ 35 public static void getInfo(Object obj){ 36 Class classObj = obj.getClass(); 37 Field fieldArray[] = classObj.getFields(); 38 for(int i=0;i<fieldArray.length;i++){ 39 Field fieldObj = fieldArray[i]; 40 String fieldName= fieldObj.getName(); 41 System.out.println(fieldName); 42 } 43 } 44 45 public static void getInfo2(Object obj){ 46 Class classObj = obj.getClass(); 47 Field fieldArray[] = classObj.getDeclaredFields(); 48 for (int i = 0; i < fieldArray.length; i++) { 49 Field fieldObj = fieldArray[i]; 50 String fieldName = fieldObj.getName(); 51 String typeName = fieldObj.getType().getName(); 52 System.out.println("属性名"+fieldName+"数据类型名"+typeName); 53 } 54 } 55 56 57 }
1 package com.bjpowernode.entity; 2 3 public class Person { 4 public String name; 5 6 }
1 package com.bjpowernode.entity; 2 3 public class StudentVO extends Person { 4 public int sid; 5 protected int age; 6 private int score; 7 8 }
1 package com.bjpowernode.def; 2 3 import com.bjpowernode.entity.StudentVO; 4 import com.bjpowernode.util.ReflectUtil; 5 6 public class 获得陌生对象中共有属性名称 { 7 8 public static void main(String[] args) { 9 10 Object stu = new StudentVO(); 11 ReflectUtil.getInfo(stu); 12 13 } 14 15 }
1 package com.bjpowernode.def; 2 3 import com.bjpowernode.entity.StudentVO; 4 import com.bjpowernode.util.ReflectUtil; 5 6 public class 获得陌生对象定义的所有属性 { 7 8 public static void main(String[] args) { 9 Object obj = new StudentVO(); 10 ReflectUtil.getInfo2(obj); 11 12 } 13 14 }
以上是关于java中的反射的主要内容,如果未能解决你的问题,请参考以下文章