Java 反射机制[Method反射]
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反射]的更多相关文章
- Java 反射机制[Field反射]
Java 反射机制[Field反射] 1. 反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...
- java反射机制 + Method.invoke解释 getMethod + 反射理解
功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...
- Java RTTI机制与反射机制
1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...
- java 类加载机制和反射机制
一.类的加载机制 jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程.(1)加载 将class文件字节码内容加载到内存中, ...
- 一篇文章看懂java反射机制(反射实例化对象-反射获得构造方法,获得普通方法,获得字段属性)
Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到C ...
- 回顾反射机制Method
package com.demo.service; public interface SayHello { void sayHello(String name); } 接口实现类 package co ...
- [Java反射机制]用反射改进简单工厂模式设计
如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...
- Java高级特性——反射机制(完结)——反射与注解
按照我们的学习进度,在前边我们讲过什么是注解以及注解如何定义,如果忘了,可以先回顾一下https://www.cnblogs.com/hgqin/p/13462051.html. 在学习反射和注解前, ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
随机推荐
- Android移动view动画问题
http://www.cnblogs.com/eoiioe/archive/2012/08/29/2662546.html Android写动画效果不是一般的麻烦,网上找了好久,终于解决了动画的问题, ...
- 基于visual Studio2013解决算法导论之002归并排序
题目 归并排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...
- 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 ...
- C#中ref参数及out参数对比
ref 关键字和out关键字均会导致参数通过引用来传递(相同点1).这是两者的共同点. 通过引用传递参数,会使方法中对参数所做的任何修改都将反映在该变量中. 两者还有一个共同点,那就是:若要使用 re ...
- Collections.sort方法对list排序的两种方式
Collections.sort( )分为两部分,一部分为排序规则,一部分为排序算法 . 规则用来判断对象,算法则考虑如何进行排序 对于自定义对象,sort()不知道规则,所以无法比较,这种情况下一定 ...
- 在Android中显示GIF动画
gif图动画在android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...
- IT忍者神龟之Oracle DBA经常使用查询吐血列举
–1. 查询系统全部对象 select owner, object_name, object_type, created, last_ddl_time, timestamp, status from ...
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
问题的原因是无法找到org.slf4j.impl.StaticLoggerBinder,我找了一下,确实没有该类,网上搜了一下下面是官方的解答http://www.slf4j.org/codes.ht ...
- JVM性能监控与优化笔记(CPU)
基础 对于CPU层面的监控主要以下几个点: 是否系统态CPU的占用率高 CPU运行队列中待运行的任务数 是否CPU停滞多,每时钟指令数(IPC)少(高级点,对于计算密集型的应用需要关注) 系统态CPU ...
- english: 遭遇
遭遇 [zāo yù] 1 (碰上: 遇到) meet with; encounter; run up against meet with misfortune; have hard luck 遭遇不 ...