java 反射使用

Posted xiaolei2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 反射使用相关的知识,希望对你有一定的参考价值。

package com.mycompany.helloworld.refect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 利用反射进行方法调用
 * Createy by user on 7/19/2018.17:57
 */
public class Demo {

    public static void main(String[] args) throws Exception {
        Class clazz = User.class;
        Object obj = clazz.newInstance();
        User u = new User("小明");
        // getDeclaredFields 得到字段
        for (Field f : clazz.getDeclaredFields()) {
            // 当isAccessible()的结果是false时不允许通过反射访问该字段
            f.setAccessible(true);
            System.out.println(f.getName() + ":" + f.get(u));
        }

        // 设置动态调用的方法 设置动态调用的方法的参数是string类型
        Method uriMethod = clazz.getMethod("sayHel", String.class);
        // 动态调用方法
        uriMethod.invoke(obj, "这是应用中的打印");
    }

    public static class User {
        private String name;
        private Integer age;

        public User() {
        }
        public User(String name) {
            this.name = name;
        }
        public void sayHel(String desc) {
            System.out.println("come --->" + desc);
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
    }
}
------------------------------------------------------------
package com.mycompany.helloworld.refect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class CommonServlet {

    private static final Map<String, String> HEADER_FIELD_RELATETION = new HashMap<String, String>();

    static {
        HEADER_FIELD_RELATETION.put("Content-Type", "setContent_type");
        HEADER_FIELD_RELATETION.put("Accept-Language", "setAccept_language");
        HEADER_FIELD_RELATETION.put("Cookie", "setCookie");
        HEADER_FIELD_RELATETION.put("Origin", "setOrigin");
        HEADER_FIELD_RELATETION.put("Locale", "setLocale");
        HEADER_FIELD_RELATETION.put("Host", "setHost");
        HEADER_FIELD_RELATETION.put("Authorization", "setAuthorization");
    }

    private MetaObject messageHeader = new MetaObject();

    public static void main(String[] args) throws Exception {
        System.out.println("refect------start");
        fillImixObjectHeader(new CommonServlet());
    }


    /**
     * HttpServletRequest 转化为MetaObject  利用反射
     * @param requestMessage
     */
    private static void fillImixObjectHeader(CommonServlet requestMessage) throws Exception {
        try {
            /**
             * 取得 CommonRequest类中的 messageHeader字段
             */
            Field headerField = requestMessage.getClass().getDeclaredField("messageHeader");
            // 当isAccessible()的结果是false时不允许通过反射访问该字段
            headerField.setAccessible(true);
            //得到反射字段为Object 反射调用方法时使用
            Object header = headerField.get(requestMessage);
            // 得到反射字段的类型 用来 获取动态调用的方法
            Class<?> headerCls = headerField.getType();

            /**
             * 利用反射动态调用类MessageHeader里面的方法
             */

            for (Map.Entry<String, String> relatetion : HEADER_FIELD_RELATETION.entrySet()) {
                String value = relatetion.getKey();
                if (value != null && !value.trim().equals("")) {
                    // 设置动态调用的方法 设置动态调用的方法的参数是string类型
                    Method headItemMethod = headerCls.getMethod(relatetion.getValue(), String.class);
                    headItemMethod.invoke(header, value); // 动态调用

                }
            }

            // 动态调用 MessageHeader类里面的setUri方法,设置动态调用的方法的参数是string类型
            Method uriMethod = headerCls.getMethod("setUri", String.class);
            uriMethod.invoke(header, "http://localhost:8080/tbs");

            // 动态调用 MessageHeader类里面的的setMethod 方法
            Method methodMethod = headerCls.getMethod("setMethod", String.class);
            methodMethod.invoke(header, "GET");
            headerField.set(requestMessage, header);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static class MetaObject {
        private String Method;
        private String authorization;
        private String host;
        private String locale;
        private String cookie;
        private String accept_language;
        private String content_type;
        private String Origin;

        public void setUri(String uri) {
            System.out.println("setUri : " + uri);
        }
        public void setMethod(String method) {
            System.out.println("setMethod:" + method);
        }
        public void setAuthorization(String var1) {
            System.out.println("setAuthorization :" + var1 );
            this.authorization = var1;
        }
        public void setHost(String host) {
            System.out.println("setHost:" +  host);
            this.host = host;
        }
        public void setLocale(String locale) {
            System.out.println("setLocale:" + locale);
            this.locale = locale;
        }
        public void setCookie(String cookie) {
            System.out.println("setCookie:" + cookie);
            this.cookie = cookie;
        }
        public void setAccept_language(String accept_language) {
            System.out.println("setAccept_language:" + accept_language);
            this.accept_language = accept_language;
        }
        public void setContent_type(String content_type) {
            System.out.println("setContent_type:" + content_type);
            this.content_type = content_type;
        }
        public void setOrigin(String origin) {
            System.out.println("setOrigin : " + origin);
            this.Origin = origin;
        }
    }

}

 

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

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

反射机制入门

反射机制入门

反射机制入门

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景