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. Android移动view动画问题

    http://www.cnblogs.com/eoiioe/archive/2012/08/29/2662546.html Android写动画效果不是一般的麻烦,网上找了好久,终于解决了动画的问题, ...

  2. 基于visual Studio2013解决算法导论之002归并排序

     题目 归并排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  3. ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables opt

    mysql跳过权限: mysqld -nt --skip-grant-tables opt 登录:mysql -uroot -p 修改root密码 set password for 'root'@'l ...

  4. C#中ref参数及out参数对比

    ref 关键字和out关键字均会导致参数通过引用来传递(相同点1).这是两者的共同点. 通过引用传递参数,会使方法中对参数所做的任何修改都将反映在该变量中. 两者还有一个共同点,那就是:若要使用 re ...

  5. Collections.sort方法对list排序的两种方式

    Collections.sort( )分为两部分,一部分为排序规则,一部分为排序算法 . 规则用来判断对象,算法则考虑如何进行排序 对于自定义对象,sort()不知道规则,所以无法比较,这种情况下一定 ...

  6. 在Android中显示GIF动画

    gif图动画在android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...

  7. IT忍者神龟之Oracle DBA经常使用查询吐血列举

    –1. 查询系统全部对象 select owner, object_name, object_type, created, last_ddl_time, timestamp, status from ...

  8. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

    问题的原因是无法找到org.slf4j.impl.StaticLoggerBinder,我找了一下,确实没有该类,网上搜了一下下面是官方的解答http://www.slf4j.org/codes.ht ...

  9. JVM性能监控与优化笔记(CPU)

    基础 对于CPU层面的监控主要以下几个点: 是否系统态CPU的占用率高 CPU运行队列中待运行的任务数 是否CPU停滞多,每时钟指令数(IPC)少(高级点,对于计算密集型的应用需要关注) 系统态CPU ...

  10. english: 遭遇

    遭遇 [zāo yù] 1 (碰上: 遇到) meet with; encounter; run up against meet with misfortune; have hard luck 遭遇不 ...