/**
* 类 描 述 :
* 修改备注:
* 创建时间:Aug 22, 2014 11:37:31 AM
* 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现
* 因为在反射看来根本不区分是否是private的,没有想到调用本 身的私有方法是可以的,
* 但是调用父类的私有方法则不行,后来纠其原因很有可能是因为getDeclaredMethod方法和getMethod方法并不
* 会查找父类的私有方法,于是只好自己写递归了,经过尝试果然如此。把代码放出来方便更多人。
* 这段代码可以解决很多实际问题,不过利用反射来做的话性能不会 太好。
*/
public class PrivateUtil {
/**
* 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。
* @param clazz
* 目标类
* @param methodName
* 方法名
* @param classes
* 方法参数类型数组
* @return 方法对象
* @throws Exception
*/
public static Method getMethod(Class clazz, String methodName, final Class[] classes) throws Exception {
Method method = null;
try {
method = clazz.getDeclaredMethod(methodName, classes);
} catch (NoSuchMethodException e) {
try {
method = clazz.getMethod(methodName, classes);
} catch (NoSuchMethodException ex) {
if (clazz.getSuperclass() == null) {
return method;
} else {
method = getMethod(clazz.getSuperclass(), methodName,classes);
}
}
}
return method;
}
/**
*
* @param obj
* 调整方法的对象
* @param methodName
* 方法名
* @param classes
* 参数类型数组
* @param objects
* 参数数组
* @return 方法的返回值
*/
public static Object invoke(final Object obj, final String methodName,final Class[] classes, final Object[] objects) {
try {
Method method = getMethod(obj.getClass(), methodName, classes);
method.setAccessible(true);// 调用private方法的关键一句话
return method.invoke(obj, 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[] {});
}
/**
* 测试反射调用
*
* @param args
*/
public static void main(String[] args) {
PrivateUtil.invoke(new B(), "printlnA", new Class[] {String.class }, new Object[]{"test"});
PrivateUtil.invoke(new B(), "printlnB");
}
分享到:
相关推荐
在某些情况下,我们需要在子类中调用父类的实现方法,以保持代码的连贯性和一致性。本篇将详细讲解C#中子类如何调用父类的实现方法。 首先,我们来看一下通过子类无参构造函数创建子类实例的情况。例如,有一个父类...
通过反射,我们可以获取类的字段、方法等元数据,甚至可以创建实例并调用其方法。本文将详细介绍如何利用Java反射机制来访问和操作父类的所有属性和方法。 #### 二、Java反射基础 在深入讨论如何操作父类之前,...
本文将深入探讨如何使用反射来获取父类中的所有属性和方法,这对于理解和调试代码、实现元编程或动态代理等高级功能非常有用。 首先,我们需要导入`java.lang.reflect`包中的关键类:`Class`、`Field`和`Method`。`...
总之,这个案例提供了一种高效的方法,利用Java反射机制在子类和父类之间进行字段赋值,减少了手动编写赋值代码的需求,提高了代码的可维护性和性能,尤其是在处理大量数据持久化或查询结果映射时。通过深入理解并...
在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细...
在这种方式中,父类可以使用反射机制来调用子类的方法。例如: ```java public class Father { public void fun4() { try { Class cls = Class.forName("com.ywq.Son"); Son son = (Son) cls.newInstance(); ...
Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...
子类的构造函数可以接受一个父类对象作为参数,然后在构造函数内部,使用成员变量直接赋值或者通过 `base` 关键字调用父类的构造函数。例如: ```csharp public class Parent { public int Id { get; set; } ...
我们可以通过调用`getSuperclass()`方法来获得一个类的直接父类。例如: ```java Class<?> superClass = Class.forName("my.package.ParentClass").getSuperclass(); ``` 这将返回`ParentClass`的`Class`对象。...
1. **子类必须调用父类的构造方法:** 子类在构造时,要么显式调用父类的构造方法,要么默认调用父类无参的构造方法。 2. **使用`super`调用父类构造方法:** 子类可以通过`super(args)`来调用父类的不同构造方法。 ...
在`main`方法中,我们可以通过直接访问和调用方法来获取子类的属性。 **标签:“源码”与“工具”:** 在实际开发中,理解源码可以帮助我们更好地掌握类库的工作原理,从而优化代码和解决问题。对于“工具”,可能...
在面向对象编程中,当我们通过父类引用调用子类对象的方法时,实际调用的是子类重写后的方法,这种现象称为晚期绑定或运行时绑定。动态绑定提高了代码的灵活性和可扩展性。 例如: ```java public abstract class ...
3. 在实际使用时,根据业务需求,我们可以创建更多的DAO实现类,它们都继承自`JDBCTemplate`,并通过反射调用父类中的方法,以完成特定的数据库操作。 通过这样的设计,我们既保留了JDBC的灵活性,又降低了代码的...
反射机制允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等),并能动态调用方法或访问和修改对象的属性。这种能力在处理未知类型的数据、实现元编程、插件系统、框架设计等方面有着广泛的应用。 1....
本章节主要讲述Java中的注解和反射机制,涵盖了注解的基本概念、内置注解、元注解和自定义注解等知识点,并引入反射机制,详细介绍了反射的概念、Class类、通过反射获取注解、通过反射创建对象、通过反射调用方法和...
//父类方法名 MethodInfo mi = pageType.GetMethod("Loading"); //参数 mi.Invoke(uc, new object[] { "参数 1", "参数 2" }); ``` 在上面的代码中,我们首先获得了父页面的实例,然后找到要调用的用户控件,最后...
通过反射,开发者可以动态地获取类的信息并调用其方法,即使这些方法在编译时并不知道。本文将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解`java.lang.Class`类,它是所有Java类的...
Java反射机制是在程序运行过程中,能够获取到关于类、接口、对象等的详细信息,并能动态地创建对象、调用方法、访问字段。这种能力使得开发者能够在不知道具体类名的情况下,仍然可以操作这些类的成员。 2. **反射...