如何在java中找到实际包含元素的类

如何在java中找到实际包含元素的类,java,oop,Java,Oop,假设我有两门课 class parentClass{ String myElement; } class childClass extends parentClass{ String notMyElemtent; } 现在假设有一个类childClass的对象。有没有一种方法可以通过编程告诉我该对象中的myElement最初属于父类 有没有办法判断该对象中的myElement最初属于父类 是的,您可以使用检查超类的字段: 用于获取超级类 然后,使用 在上述调用返回的类上,获取超

假设我有两门课

class parentClass{
   String myElement;
}
class childClass extends parentClass{
   String notMyElemtent;
}
现在假设有一个类childClass的对象。有没有一种方法可以通过编程告诉我该对象中的myElement最初属于父类

有没有办法判断该对象中的myElement最初属于父类

是的,您可以使用检查超类的字段:

  • 用于获取超级类
  • 然后,使用
    • 在上述调用返回的类上,获取超类声明的所有字段的列表
    • 直接检查给定字段的存在性
在代码中,这可能看起来像:

public static boolean belongsToParent(Object o, String fieldName) {
   Class<?> sc = o.getClass().getSuperclass();
   boolean result = true;
   try {
      sc.getDeclaredField(fieldName);
   } catch (NoSuchFieldException e) {
      result = false;
   }
   return result;
}

public static void main(String[] args) {
   childClass cc = new childClass();

   System.out.println("myElement belongs to parentClass: " + 
                      belongsToParent(cc,  "myElement"));
   System.out.println("notMyElemtent belongs to parentClass: " + 
                      belongsToParent(cc,  "notMyElemtent"));
}
好吧,使用一个类,如果它不在那里,试着看看它的超类,依此类推。适用于多个继承级别:

Class<?> clazz = childClass.class;
do {
    try {
        Field f = clazz.getDeclaredField(fieldName);
        //there it is! print the name of the super class that holds the field
        System.out.println(clazz.getName());
    } catch (NoSuchFieldException e) {
        clazz = clazz.getSuperclass();
    }
} while (clazz != null);
Class clazz=childClass.Class;
做{
试一试{
字段f=clazz.getDeclaredField(字段名);
//就是这样!打印包含该字段的超类的名称
System.out.println(clazz.getName());
}捕获(无此字段例外){
clazz=clazz.getSuperclass();
}
}while(clazz!=null);

您可以通过反射来完成。使用obj.getClass().getField(“myElement”)获取表示字段的字段对象。 现在您可以使用接口的方法来获取实际声明此成员的类或接口。那就这样做吧

childClass obj = new childClass();
Field field = obj.getClass().getField("myElement");
if (field.getDeclaringClass().equals(parentClass.class)) {
    // do whatever you need
}
import java.lang.reflect.Field;
公共类Test4{
公共静态void main(字符串[]args){
子项=新子项();
System.out.println(getDeclaringClass(child.getClass(),“value”);
}
公共静态字符串getDeclaringClass(类clazz,字符串名称){
试一试{
字段字段=clazz.getDeclaredField(名称);
}捕获(无此字段例外){
if(clazz.getSuperclass()!=null){
返回getDeclaringClass(clazz.getSuperclass(),name);
}否则{
返回null;
}
}
返回clazz.getName();
}
}
班级家长{
字符串value=“某物”;
}
类子级扩展父级{
}

我不太确定你在问什么。您希望能够编写什么代码?请在代码中添加一些解释或说明。无论如何+1,因为你是新来的,想帮忙!很好的方法,但有两点:1
getField()
是类的一种方法-您需要执行
obj.getClass().getField()
。2.
getField()
仅返回公共字段(这与使用
getDeclaredFields()
不同)-使用问题中的原始代码时,您根本无法获取字段,因为它们具有默认保护。1。当然,这是我的错误,我会改正的。2.
getDeclaredFields()
只返回由该类声明的字段。因此,如果我们调用
childClass.class.getDeclaredFields()
,我们将不会得到“myElement”。
childClass obj = new childClass();
Field field = obj.getClass().getField("myElement");
if (field.getDeclaringClass().equals(parentClass.class)) {
    // do whatever you need
}
import java.lang.reflect.Field;

public class Test4 {

    public static void main(String[] args){
        Child child = new Child();
        System.out.println(getDeclaringClass(child.getClass(), "value"));

    }

    public static String getDeclaringClass(Class<?> clazz, String name) {
        try {
            Field field = clazz.getDeclaredField(name);
        } catch (NoSuchFieldException e) {
            if(clazz.getSuperclass() != null){
                return getDeclaringClass(clazz.getSuperclass(), name);              
            }else{
                return null;
            }
        }

        return clazz.getName();
    }
}

class Parent {
    String value = "something";

}

class Child extends Parent {

}