Java 反射机制[Method反射]

接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射。演示样例代码非常简单,非常easy理解。

能够看到Method.invoke()实际上并非自己实现的反射调用逻辑,而是托付给sun.reflect.MethodAccessor来处理。 真正的反射是调用MethodAccessor.invoke()真正完毕反射调用。看源代码能够发现MethodAccessor.invoke() 方法中出现了非常多跟Cached有关的变量,说明method的反射十分消耗性能。

Java Code

/*

* System Abbrev :

* system Name  :

* Component No  :

* Component Name:

* File name     :ReflectTestMain.java

* Author        :Qiuzhenping

* Date          :2014-10-25

* Description   :  <description>

*/



/* Updation record 1:

 * Updation date        :  2014-10-25

 * Updator          :  Qiuzhenping

 * Trace No:  <Trace No>

 * Updation No:  <Updation No>

 * Updation Content:  <List all contents of updation and all methods updated.>

 */

package com.qiuzhping.reflect.main;



import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;





/**

 * <Description functions in a word>

 * 反射就是把Java类中的各种成分映射成对应的Java类。

 * <Detail description>

 *

 * @author  Qiuzhenping

 * @version  [Version NO, 2014-10-25]

 * @see  [Related classes/methods]

 * @since  [product/module version]

 */

public class ReflectTestMain {



    /** <default constructor>

     */

    public ReflectTestMain() {

        // TODO Auto-generated constructor stub

    }



    /** <Description functions in a word>

     * 2014-10-25

     * <Detail description>

     * @author  Qiuzhenping

     * @param args [Parameters description]

     * @return void [Return type description]

     * @exception throws [Exception] [Exception description]

     * @see [Related classes#Related methods#Related properties]

     */

    public static void main(String[] args) throws Exception{

        // TODO Auto-generated method stub

        //Constructor[] contructor = Person.class.getConstructors();

        //Method[] method = Person.class.getMethods();

        Person p = new Person(24, "Qiuzhping", "100001", "Qiuzhping");

//        Field [] field = p.getClass().getDeclaredFields();

//        for(Field f:field){

//            f.setAccessible(true);

//            System.out.println(f.getName());

//            Object obj = f.get(p);

//            System.out.println(obj);

//        }

        changeStringValue(p);

        System.out.println(p.toString());

        callPersonSetNameMethod(p);

        System.out.println(p.toString());

    }



    /** <Description functions in a word>

     *  通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射<BR>

     *  2014-10-26

     * <Detail description>

     * @author  Qiuzhenping

     * @param obj

     * @throws Exception [Parameters description]

     * @return void [Return type description]

     * @exception throws [Exception] [Exception description]

     * @see [Related classes#Related methods#Related properties]

     */

    private static void callPersonSetNameMethod(Object obj) throws Exception {

        Method[] methods = Person.class.getMethods();//获取所有方法

        for(Method m : methods){

            m.setAccessible(true);//暴力反射

            if(m.getName().equals("setName")){

                m.invoke(obj, "callPersonSetNameMethod");//将obj的name字段的Value设置为"callPersonSetNameMethod"

                /**

                 * 下面是Java method关于invoke方法的源代码

                 * 能够看到Method.invoke()实际上并非自己实现的反射调用逻辑,而是托付给sun.reflect.MethodAccessor来处理。


                 * 真正的反射是调用MethodAccessor.invoke()真正完毕反射调用。

                 * 看源代码能够发现MethodAccessor.invoke() 方法中出现了非常多跟Cached有关的变量,

                 * 说明method的反射十分消耗性能

                 *  public Object invoke(Object obj, Object... args)

                throws IllegalAccessException, IllegalArgumentException,

                       InvocationTargetException

                {

                    if (!override) {

                        if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {

                            Class caller = Reflection.getCallerClass(1);

                            Class targetClass = ((obj == null || !Modifier.isProtected(modifiers))

                                                 ? clazz

                                                 : obj.getClass());

            

                    boolean cached;

                    synchronized (this) {

                        cached = (securityCheckCache == caller)

                            && (securityCheckTargetClassCache == targetClass);

                    }

                    if (!cached) {

                        Reflection.ensureMemberAccess(caller, clazz, obj, modifiers);

                        synchronized (this) {

                        securityCheckCache = caller;

                        securityCheckTargetClassCache = targetClass;

                        }

                    }

                        }

                    }

                    if (methodAccessor == null) acquireMethodAccessor();

                    return methodAccessor.invoke(obj, args);

                }

                 * */

            }

        }

    }



    /** <Description functions in a word>

     *  将obj对象中的String类型的字段相应的Value中含有i的字符替换为abc<BR>

     *  2014-10-26

     * <Detail description>

     * @author  Qiuzhenping

     * @param obj [Parameters description]

     * @return void [Return type description]

     * @exception throws [Exception] [Exception description]

     * @see [Related classes#Related methods#Related properties]

     */

    private static void changeStringValue(Object obj) throws Exception {

        Field[] fields = obj.getClass().getDeclaredFields();

        for(Field f : fields){

            f.setAccessible(true);//暴力反射

            if(f.getType() == String.class){//字节码比較是用 ==

                String oldValue = (String) f.get(obj);

                String newValue = oldValue.replaceAll("i", "abc");//将全部的i替换为abc

                f.set(obj, newValue);

            }

        }

        

    }

    

     static class Person {



        public Person(int age, String name, String id, String pwd) {

            super();

            this.age = age;

            this.name = name;

            this.id = id;

            this.pwd = pwd;

        }

        @Override

        public String toString() {

            return "age = "+age +"\tname = "+name+"\tid = "+id+"\tpwd = "+pwd;

        }

        private int age;

        private String name;

        private String id;

        private String pwd;

        public int getAge() {

            return age;

        }

        public void setAge(int age) {

            this.age = age;

        }

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public String getId() {

            return id;

        }

        public void setId(String id) {

            this.id = id;

        }

        public String getPwd() {

            return pwd;

        }

        public void setPwd(String pwd) {

            this.pwd = pwd;

        }

        /** <default constructor>

         */

        public Person() {

            // TODO Auto-generated constructor stub

        }



    }



}

Java 反射机制[Method反射]的更多相关文章

  1. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  2. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  3. Java RTTI机制与反射机制

    1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...

  4. java 类加载机制和反射机制

    一.类的加载机制 jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程.(1)加载         将class文件字节码内容加载到内存中, ...

  5. 一篇文章看懂java反射机制(反射实例化对象-反射获得构造方法,获得普通方法,获得字段属性)

    Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到C ...

  6. 回顾反射机制Method

    package com.demo.service; public interface SayHello { void sayHello(String name); } 接口实现类 package co ...

  7. [Java反射机制]用反射改进简单工厂模式设计

    如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...

  8. Java高级特性——反射机制(完结)——反射与注解

    按照我们的学习进度,在前边我们讲过什么是注解以及注解如何定义,如果忘了,可以先回顾一下https://www.cnblogs.com/hgqin/p/13462051.html. 在学习反射和注解前, ...

  9. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

随机推荐

  1. Jquery progressbar通过Ajax请求获取后台进度演示

    项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...

  2. 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码

    前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ...

  3. PHP - 判断php是否对表单数据内的特殊字符自动转义

    get_magic_quotes_gpc 有两个返回值: 0:在php.ini文件中已经关闭自动转移. 1:在php.ini文件中已经开启自动转移. 由此函数进行判断表单是否转移: /** * * m ...

  4. Excel 公式(细节若干)

    查找与引用: 1.如果需要找出匹配元素的位置而不是匹配元素本身,则应该使用 MATCH 函数而不是 LOOKUP 函数. 2.VLOOKUP的第一个参数允许使用通配符“*”来表示包含的意思,把*放在字 ...

  5. TCP协议中的计时器

    说明:  本文仅供学习交流.转载请标明出处,欢迎转载! 本文是下面文献相关内容的总结 [1] <TCP/IP具体解释 卷1:协议> [2] <TCP/IP协议族 第4版> [3 ...

  6. 基于Linux的视频传输系统(上大学时參加的一个大赛的论文)

    文件夹 1原创性声明----------------------------------------------------3 2 摘要-------------------------------- ...

  7. Fragment与FragmentActivity通信封装

    在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi ...

  8. Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  9. 基于visual Studio2013解决面试题之0601二叉树深度

     题目

  10. 解决cocoapods在64位iOS7系统以下的警告问题

    今天碰到一个非常奇怪的问题.XCODE提示这种警告 Pods was rejected as an implicit dependency for 'libPods.a' because its ar ...