`

通过reflection控制一个对象的方法调用

阅读更多

 

package com.cn;

import java.lang.reflect.Method;

public class Reflect {
/**
 * 递归向上(父类)寻找方法
 * @param clazz0        目标Class
 * @param methodName    方法名称
 * @param arg_classes   方法参数Class
 * @return              Method
 * @throws Exception
 */
public static Method getMethod(Class clazz0, String methodName, 
        final Class[] arg_classes) throws Exception { 
    Method method = null; 
    try { 
        method = clazz0.getDeclaredMethod(methodName, arg_classes); 
    } catch (NoSuchMethodException e) { 
        try { 
            method = clazz0.getMethod(methodName, arg_classes); 
        } catch (NoSuchMethodException ex) { 
            if (clazz0.getSuperclass() == null) { 
                return method; 
            } else { 
                method = getMethod(clazz0.getSuperclass(), methodName, 
                        arg_classes); 
            } 
        } 
    } 
    return method; 

/**
 * @param obj0          目标对象
 * @param methodName    方法名
 * @param args_classes  方法参数class类型
 * @param arg_objects   方法实体参数
 * @return
 */
public static Object invoke(final Object obj0, final String methodName, 
        final Class[] args_classes, final Object[] arg_objects) { 
    try { 
        Method method = getMethod(obj0.getClass(), methodName, args_classes); 
        method.setAccessible(true); // 强制将方法设置成可访问状态(调用private方法)  
        return method.invoke(obj0, arg_objects); 
    } catch (Exception e) { 
        throw new RuntimeException(e); 
    } 

public static Object invoke(final Object obj, final String methodName, 
        final Class[] classes) { 
    return invoke(obj, methodName, classes, new Object[] {}); 

public static Object invoke(final Object obj, final String methodName) { 
    return invoke(obj, methodName, new Class[] {}, new Object[] {}); 

}

分享到:
评论

相关推荐

    一个采用反射进行数据对象的装载Filling Data objects using Reflection程序源码

    这个“Filling Data objects using Reflection”程序源码是关于如何利用反射来动态地填充数据对象的一个示例。下面我们将深入探讨反射的基本概念以及在数据对象装载中的应用。 首先,我们需要理解什么是数据对象。...

    java reflection in action

    1. **Class类**:每个Java类在运行时都有一个与之对应的Class对象,可以通过`Class.forName()`或对象的`getClass()`方法获取。Class对象提供了获取类信息的方法,如类名、包名、父类、接口、枚举常量等。 2. **...

    基于Java Reflection自动逆向生成类间方法关系图的解析器.zip

    2. **Method对象**:代表类中的一个方法。通过Class对象的`getMethods()`或`getDeclaredMethods()`方法可以获取类的方法信息,包括方法名、返回类型、参数类型等。 3. **Field对象**:表示类的字段。类似地,可以...

    反射Reflection小应用

    在提供的"Test"压缩包文件中,可能包含了一个简单的反射应用示例,例如创建一个类,然后通过反射调用其方法或访问其字段。学习这个小例子可以帮助初学者更好地理解反射的实际运用。然而,反射虽然强大,但应谨慎使用...

    Reflection.zip

    在.NET框架中,Reflection是一个强大的工具,它允许程序员在运行时检查和操作程序集、类型、方法、属性等对象。Reflection.zip文件中的ConsoleApp1示例可能是用来演示如何使用反射来实现动态代码执行和元数据探索。...

    Laravel开发-reflection

    在Laravel框架中,Reflection是一个重要的概念,它主要涉及到PHP的反射API(Reflection API)。反射是一种在运行时分析类、接口、方法等元数据的技术,它允许程序在执行过程中检查自身的行为和结构。在Laravel中,...

    浪曦经典Java代码--反射+代理reflection_proxy源码

    `invoke()`方法会处理所有通过代理对象发出的方法调用。 3. 反射的应用:可能包括动态获取类信息,实例化对象,调用私有方法,访问私有字段等。 4. 代理的使用场景示例:比如AOP(面向切面编程)中的日志记录、权限...

    VB调用函数指针,几近完美

    这允许通过对象调用函数,从而实现类似函数指针的效果。 3. **ActiveX DLL或COM组件**: VB6及更早版本可以通过创建ActiveX DLL或COM组件来使用函数指针。在DLL或COM组件中定义一个函数指针类型,然后在VB中通过创建...

    java创建对象的五种方法demo

    如果一个类实现了`Cloneable`接口并重写了`clone()`方法,那么可以通过`clone()`创建对象的副本。例如: ```java class CloneExample implements Cloneable { // ... @Override protected Object clone() ...

    JAVA 私塾笔记整理——反射机制(Reflection)

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理对象、类、接口以及它们之间的关系...

    C# 反射 Reflection

    例如,`Activator.CreateInstance(typeof(MyClass))`会创建一个`MyClass`的新实例。 三、探索类和成员 1. 获取类信息:`Type.GetProperties()`, `Type.GetMethods()`, `Type.GetConstructors()`等方法用于获取类的...

    代理模式实例

    - 客户端代码,通过代理对象调用原始对象的方法。 代理模式的优点在于: - **解耦**:客户端只与代理对象交互,不必了解原始对象的具体实现细节。 - **扩展性**:可以通过代理对象添加新的功能,而不会影响原始对象...

    High performance Java reflection.zip

    Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至在不预先知道具体类型的情况下动态调用方法和访问字段。在"High performance Java reflection.zip"这个压缩包中,我们...

    WCF.rar_ChannelFactory_WCF DynamicProxy_WCF 动态_wcf 动态调用_动态WCF

    在WCF中,可以使用`Castle.DynamicProxy`库或者.NET Framework的`System.Reflection.Emit`命名空间来创建动态代理,从而在调用WCF服务时添加日志、事务控制等特性,而无需修改服务契约接口。 **WCF动态调用** 是指...

    reflection_java_joyopf_

    创建一个`Class`对象通常是通过类名或者对象的`getClass()`方法。一旦有了`Class`对象,我们就可以使用`newInstance()`创建该类的实例,或者通过`getMethod()`、`getConstructor()`和`getField()`来获取方法、构造器...

    java-reflection-Xiangjie.rar_java 反射

    对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 在Java中,反射的核心类主要有三个:Class类、Constructor类和Method类。Class类...

    mvc通过反射获取action方法(适用于权限控制)

    在MVC框架中,权限控制是一个非常重要的功能,它确保了用户只能访问他们被授权的功能模块。本文将详细介绍如何利用反射技术来获取MVC应用中的所有Action方法,并以此为基础实现权限控制。 #### 一、反射的基本概念 ...

    JAVA代理

    最后,通过`Proxy.newProxyInstance()`方法,我们可以生成一个实现了`UserService`接口的代理对象,这个代理对象在调用方法时会委托给`MyInvocationHandler`。 总结一下,`JAVA代理`涉及到的主要知识点包括: 1. **...

    Java实现软键盘代码,HOOK调用

    总的来说,这个项目提供了一个Java实现软键盘并利用Hook技术的实例,对于理解Java中的Hook机制、图形用户界面开发以及跨平台库的使用具有一定的学习价值。通过深入研究这个项目,开发者可以提升对Java高级特性的理解...

Global site tag (gtag.js) - Google Analytics