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);