Java 反射机制[Method反射]
接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射。示例代码很简单,很容易理解。
可以看到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.invoke解释
本文档是关于java的反射的组件Method的描述
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
使用JAVA反射机制动态调用 计算器对象的加法,减法函数。 使用JAVA反射机制修改一个学生对象 的私有数据成员(不允许调用setters) 使用的类有Class, Method, Field
java反射机制基础学习。Class、Method、Field
3.2.1 Java反射机制的概念 3.2.2 反射机制的功能 3.2.3 Java反射机制的相关API 3.2.4 使用反射机制的步骤 3.2.5 反射机制的应用场景 3.2.6 反射机制的优缺点 Java高级程序设计实战教程第三章-Java反射机制全文共15页...
java反射机制详解及Method.invoke解释.pdf
主要介绍了Java反射机制及Method.invoke详解,本文讲解了JAVA反射机制、得到某个对象的属性、得到某个类的静态属性、执行某对象的方法、执行某个类的静态方法等内容,需要的朋友可以参考下
java反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJB
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...
java 反射 服务器上报错 no such method exceptionjava 反射 服务器上报错 no such method exceptionjava 反射 服务器上报错 no such method exceptionjava 反射 服务器上报错 no such method exceptionjava 反射 ...
Method,invoke,getMethod等反射私有方法和私有属性
Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法
反射机制package com.langsin.reflection; import java.lang.reflect.Method; public class DumpMethods { public static void main(String args[]) throws Exception { // 加载并初始化命令行参数指定的类 ...
NULL 博文链接:https://1017401036.iteye.com/blog/2343705
反射之操作 Method 成员方法类.md
import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { c = Class.forName("java.lang....
Chp15 反射Key Point ●Class 对象及其基本操作●Method 对象以及invoke 方法●标注练习 1. (类对象)要获得类对象,有三种不同的方式,分别为_____________________、___________________、_____________________...
java vm很清楚你编写的class的结构,所以j2sdk提供了反射机制来动态的调用class的方法,举个例子,我们在调用对象的方法,常用的可能是obj.invokedmethod,而用发射机制,可以写成Invoker.invoke("className",...
java reflect Method getDeclaredMethod invoke getConstructor