Java 方法在不同的对象上执行相同的操作

Java 方法在不同的对象上执行相同的操作,java,reflection,Java,Reflection,我目前正在制作一个库,它是我处理与问题无关的东西的一个实用工具(我没有暗示这个主题,因为它不是真正重要的),但是它确实使用了反射 我正在从一个类中检索所有声明和继承的方法,该类目前运行良好,不是问题所在。但问题是,我也需要对子类执行此操作,因为这些子类继承类似的方法(但是不能重写类似的方法) 我面临的问题是,它将使用相同的算法,但会有差异,而不是调用clazz.getDeclaredMethods()我需要调用clazz.getMethods。最好的方法是什么,我需要在方法签名中返回类[]和方法

我目前正在制作一个库,它是我处理与问题无关的东西的一个实用工具(我没有暗示这个主题,因为它不是真正重要的),但是它确实使用了反射

我正在从一个类中检索所有声明和继承的方法,该类目前运行良好,不是问题所在。但问题是,我也需要对子类执行此操作,因为这些子类继承类似的方法(但是不能重写类似的方法)

我面临的问题是,它将使用相同的算法,但会有差异,而不是调用
clazz.getDeclaredMethods()
我需要调用
clazz.getMethods
。最好的方法是什么,我需要在方法签名中返回类[]和方法[]

通常我会寻找一个共享的超类,但在这种情况下,我更喜欢相应地使用类[]和方法[]。首先,我做了一些研究,发现了一些共享的超类:

  • 一般性声明
  • 注释删除
因为我需要类[]和方法[]数组,所以我在想一些事情 与泛型类似,因此该方法如下所示:

public static <T extends GenericDecleration> T[] getT () {

}
现在,该方法也将返回正确的类型,因此您不必手动将所有GenericDeclaration转换为原始对象类型。我的问题是我使用了一个集合,而不是正确的数组:

public <T> T[] getAll (final DeclExtractor<T> extractor, Class<?> clazz) {
    T[] declaration = extractor.extract (clazz);
    //.. The algorithm..

    // Return an instance of a collection as array (I use a set in my implementation)
    final Object[] objects = myCollection.toArray();
    return Arrays.copyOf(objects, objects.length, extractor.getGenericClass());
}
public T[]getAll(最终DeclExtractor提取器,类clazz){
T[]声明=提取器.extract(clazz);
//…算法。。
//以数组形式返回集合的实例(我在实现中使用集合)
final Object[]objects=myCollection.toArray();
返回Arrays.copyOf(objects,objects.length,extractor.getGenericClass());
}
从技术上讲,您不需要接口中的
getGenericClass
方法,但我在循环中直接使用
extract
,因此我无法提取该类,但是,您可以。
希望这对将来的人有所帮助:)再次感谢@dasblinkenlight提供的灵感

您的
getT
需要获得一些输入以决定要做什么

一个可以将
enum
作为参数来确定是否需要获取类或方法的方法怎么样?(摘自评论)

有一种更好的方法:定义一个执行适当提取的接口,并为其创建两个实例—一个用于提取类,另一个用于提取方法:

public interface DeclExtractor {
    GenericDecleration[] extract(Class cl);
    final DeclExtractor forClasses = new DeclExtractor() {
        public GenericDecleration[] extract(Class cl) {
            // make an array of GenericDecleration from extracted classes
        }
    };
    final DeclExtractor forMethods = new DeclExtractor() {
        public GenericDecleration[] extract(Class cl) {
            // make an array of GenericDecleration from extracted methods
        }
    };
}
现在,您可以重写
getT
以获取“提取器”,如下所示:

public static GenericDecleration[] getT (DeclExtractor extractor, Class cl) {
    ...
    // When it's time to get components of the class, make this call:
    GenericDecleration[] components = extractor.extract(cl);
    ...
}
要启动对
getT
的调用,请传递
DeclExtractor.forclass
DeclExtractor.forMethods

GenericDecleration[] c = getT(DeclExtractor.forClasses);
GenericDecleration[] m = getT(DeclExtractor.forMethods);

“但我如何检测是否需要调用getDeclaredMethods或GetDeclaredClass?”API的输入中有什么驱动了调用其中一个或另一个的决定
getT
不接受参数,而且它也是
静态的
,所以它怎么知道调用什么呢?@dasblinkenlight这是一个很好的观点。。一个可以将枚举作为参数来确定是否需要获取类或方法的方法怎么样?这将是一些三元操作,但是如果我使用超类,它应该可以工作,但是在代码中它看起来不像我想要的那么干净。非常感谢你的这个天才想法!这类问题显然很容易解决,你只需跳出框框思考,更多地使用语言。谢谢
GenericDecleration[] c = getT(DeclExtractor.forClasses);
GenericDecleration[] m = getT(DeclExtractor.forMethods);