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注解框 ...
随机推荐
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...
- Myeclipse 设定文件的默认打开方式
Myeclipse 设定文件的默认打开方式.今天下载了一个properties的中文插件,希望.property的文件能默认以这个程序打卡.说一下设置方法. Window -> Preferen ...
- [WCF]WCF起航
解决方案概览: Client:windows 控制台应用程序. WcfService1: windows 服务应用程序. WCFWebTest:asp.net 空web应用程序. 变量程序命名.结构可 ...
- java 基于JDK中的源码总结下String二
申明:转载请注明出处,如有商用目的请务必知会本人,感谢. 上一篇文章:http://blog.csdn.net/ts1122/article/details/8738336,介绍了String一些易错 ...
- Axure快捷键大全 Axure RP Pro 6.5快捷键
习惯用Axure快捷键会让你做原型的时候更得心应手.Axure中文网总结了常用的一些快捷键分享给大家 . Axure RP Pro 6.5快捷键大全,如有疏漏,欢迎补充. 基本快捷键: 打开:Ct ...
- Android之一个简单计算器源代码
通过Android4.0 网格布局GridLayout来实现一个简单的计算器界面布局 源码如下(欢迎大家指导 批评 ) package com.android.xiong.gridlayoutTe ...
- 14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制: MySQL 复制工作对于InnoDB 表和对于MyISAM表. 它是可能使用复制的方式 存储引 ...
- DRP——Servlet(一)
Servlet Servlet是用java语言编写的程序,执行在Webserver上,用来处理来自client的请求:通常会把处理的结果以HTML的形式返回,在client形成动态网页.事实上能够理解 ...
- 快速排序原理、复杂度分析及C语言实现
本文作者华科小涛:@http://www.cnblogs.com/hust-ghtao/,参考<算法导论>,代码借用<剑指offer> 快速排序是一种最坏情况时间复杂度为的排序 ...
- webdynpro tree控件使用
1. 首先创建一个TREE控件 2. 在Tree下面创建一个TREE NODE TYPE ,node type 是可以继续展开的,而Item type是无法展开的. 3. 创建node.,下面 ...