有没有办法压缩继承的类来发现哪些函数属于哪个类?
如果您有类似的课程:
public class Person
{
public String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
和一个继承的类,如
public class Worker extends Person
{
public String job;
public void setJob(String job){
this.job = job;
}
public String getJob(){
return this.job;
}
}
当您实例化Worker时,有没有办法找出Set / GetName属于Person类?
我已经看到了使用界面查找此信息的建议,但我不确定界面如何最好地用于显示此处的函数关系。是否有任何作弊能够引用继承类中的特定类?
修改
回答我为什么要这样做:我基本上希望能够遍历对象中的方法并忽略来自某个类的方法,在这个例子中我想忽略Person类。
我的真实世界的例子不是那么简单,但我想不出更好的方法来确定哪些方法属于哪个类而不“扁平化”它们。
答案 0 :(得分:6)
isBridge
类中的Method
方法可用于检查方法是否在Person
或Worker
类中声明。
public static void main(String[] args)
{
Worker worker = new Worker();
Class clazz = worker.getClass();
Method[] methods = clazz.getDeclaredMethods();
for(Method method :methods)
{
System.out.println(method.getName()+ " is in Worker: "+ !method.isBridge());
}
}
上面的代码将输出为:
setName is in Worker: false
getName is in Worker: false
setJob is in Worker: true
getJob is in Worker: true
答案 1 :(得分:1)
您可以使用Reflection API来检查对象中是否存在方法,但我不明白为什么要这样做。记住多态性是如何工作的,我们应该将Worker
的实例视为Worker
或Person
,但为什么将它视为Worker
为“不是Person
{1}}“?
Worker w = new Worker();
Class c = w.getClass();
Class noparams[] = {};
boolean hasSetJob = false;
try{
c.getDeclaredMethod("setJob", noparams);
hasSetJob = true;
} catch (NoSuchMethodException e) {
hasSetJob = false;
}
无论如何, Reflection API 在应用程序(而不是框架)代码中的任何用途都被视为黑客和一个你想做奇怪事情的标志(通常是错误的)。
答案 2 :(得分:1)
如果我理解你的问题,你可以这样试试:
Class c = new Worker().getClass();
Method[] ma = c.getMethods();
for (Method m : ma) {
String methodClass = m.getDeclaringClass().getName();
if(methodClass.equals("net.yourpackage.Person")){
// do something...
}
else if(methodClass.equals("net.yourpackage.Worker")){
// do something...
}
// ... other classes
else if(methodClass.equals("java.lang.Object")){
// do something else...
}
}