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 }
View Code
技术分享
1 package com.bjpowernode.entity;
2 
3 public class Person {
4     public String name;
5 
6 }
View Code
技术分享
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 }
View Code
技术分享
 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 }
View Code
技术分享
 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 }
View Code

 

以上是关于java中的反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

对于java反射的理解

java Java中的缓存反射访问(来自Spring Framework代码库)

LockSupport.java 中的 FIFO 互斥代码片段