您的位置 首页 java

Java,反射机制,反射调用,反射取值和赋值类静态属性和实例属性

反射机制概念

引用

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在 Lisp 和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和Open java 等就是基于反射机制的语言。

Java 反射机制

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

代码案例

工具类

 import java.lang.reflect.Field;

public class ReflectCallField {

    /**
     * @param entryClass
     * @param fieldName
     * @param <T>
     * @return
     */
    public  static  <T> T getForStatic(Class entryClass, String fieldName) {
        if (entryClass == null) {
            return null;
        }
        T result = null;
        try {
            // 反射获取
            Field callField = entryClass.getDeclaredField(fieldName);
            callField.setAccessible(true);
            return (T) callField.get(entryClass);
        } catch ( Exception  e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * @param entryClass
     * @param fieldName
     * @param value
     */
    public  Static   void  setForStatic(Class entryClass, String fieldName, Object value) {
        if (entryClass == null) {
            return;
        }
        try {
            Field callField = entryClass.getDeclaredField(fieldName);
            callField.setAccessible(true);
            callField.set(fieldName, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param entryObject
     * @param fieldName
     * @param <T>
     * @return
     */
    public static <T> T getForInstance(Object entryObject, String fieldName) {
        if (entryObject == null) {
            return null;
        }
        T result = null;
        try {
            // 反射获取
            Field callField = entryObject.getClass().getDeclaredField(fieldName);
            callField.setAccessible(true);
            return (T) callField.get(entryObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * @param entryObject
     * @param fieldName
     * @param value
     */
    public static void setForInstance(Object entryObject, String fieldName, Object value) {
        if (entryObject == null) {
            return;
        }
        try {
            Field callField = entryObject.getClass().getDeclaredField(fieldName);
            callField.setAccessible(true);
            callField.set(entryObject, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}  

类静态属性,反射取值赋值:

 import java.util. HashMap ;
import java.util.Map;

public class StaticModel {

     private  static Map<String, Object> objectMap = new HashMap<>();
    private static Map<String, Object> FILE_TYPE_MAP = new HashMap<>();

    static {
        objectMap.put("1", new Object());
        FILE_TYPE_MAP.put("fileType1", new Object());
    }

}  
 import java.util.Map;

public class StaticModelDemo {

    public static void main(String[] args) {
        // 取值
        Map<String, Object> objectMap = ReflectCallField.getForStatic(StaticModel.class, "objectMap");
        System.out.println(objectMap);
        Map<String, Object> FILE_TYPE_MAP = ReflectCallField.getForStatic(StaticModel.class, "FILE_TYPE_MAP");
        System.out.println(FILE_TYPE_MAP);
        // 赋值
        objectMap.put("2", new Object());
        FILE_TYPE_MAP.put("fileType2", new Object());
        ReflectCallField.setForStatic(StaticModel.class, "objectMap", objectMap);
        ReflectCallField.setForStatic(StaticModel.class, "FILE_TYPE_MAP", FILE_TYPE_MAP);
        // 取值
        objectMap = ReflectCallField.getForStatic(StaticModel.class, "objectMap");
        System.out.println(objectMap);
        FILE_TYPE_MAP = ReflectCallField.getForStatic(StaticModel.class, "FILE_TYPE_MAP");
        System.out.println(FILE_TYPE_MAP);
    }

}
  

类实例(成员)属性,反射取值赋值:

 import java.util.HashMap;
import java.util.Map;

public class InstanceModel {

    private Map<String, Object> objectMap = new HashMap<>();
    private Map<String, Object> FILE_TYPE_MAP = new HashMap<>();

    {
        objectMap.put("1", new Object());
        FILE_TYPE_MAP.put("fileType1", new Object());
    }

}  
 import java.util.Map;

public class InstanceModelDemo {

    public static void main(String[] args) {
        InstanceModel instanceModel = new InstanceModel();
        // 取值
        Map<String, Object> objectMap = ReflectCallField.getForInstance(instanceModel, "objectMap");
        System.out.println(objectMap);
        Map<String, Object> FILE_TYPE_MAP = ReflectCallField.getForInstance(instanceModel, "FILE_TYPE_MAP");
        System.out.println(FILE_TYPE_MAP);
        // 赋值
        objectMap.put("2", new Object());
        FILE_TYPE_MAP.put("fileType2", new Object());
        ReflectCallField.setForInstance(instanceModel, "objectMap", objectMap);
        ReflectCallField.setForInstance(instanceModel, "FILE_TYPE_MAP", FILE_TYPE_MAP);
        // 取值
        objectMap = ReflectCallField.getForInstance(instanceModel, "objectMap");
        System.out.println(objectMap);
        FILE_TYPE_MAP = ReflectCallField.getForInstance(instanceModel, "FILE_TYPE_MAP");
        System.out.println(FILE_TYPE_MAP);
    }

}
  

文章来源:智云一二三科技

文章标题:Java,反射机制,反射调用,反射取值和赋值类静态属性和实例属性

文章地址:https://www.zhihuclub.com/186295.shtml

关于作者: 智云科技

热门文章

网站地图