如何在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,因为你是新来的,想帮忙!很好的方法,但有两点:1getField()
是类的一种方法-您需要执行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 {
}