如何获取实例的对象引用类型?

时间:2014-01-08 05:48:10

标签: java types classname object-reference

鉴于 界面抽象类具体类

interface Interface {
}

abstract class AbstractClass {
}

class C extends AbstractClass implements Interface {
}

我实例化我的具体类C的两个实例,如此

Interface a = new C();

AbstractClass b = new C();

System.out.println(getObjectReferenceName(a));// return some.package.Interface

System.out.println(getObjectReferenceName(b));// return some.package.AbstractClass

/ * 它返回Object引用的类名 * /

String getObjectReferenceName(Object o){
    // todo
    return "class name";
}

如何获取引用类型的类名?

那是 -

a的对象引用是 some.package.Interface

b的对象引用是 some.package.AbstractClass

5 个答案:

答案 0 :(得分:1)

要获得名称,请尝试

System.out.println(a.getClass().getInterfaces()[0]);
System.out.println(b.getClass().getSuperclass());

<强>输出:

interface testPackage.InterfaceClass
class testPackage.AbstractClass

如果您想检查对象是否为类的实例,请尝试instanceof

修改

如果要获取声明变量的类型,可以使用反射。如果这些是字段,换句话说,如果它们被声明为类字段,则没有局部变量。

System.out.println(Test.class.getDeclaredField("a").getType()); // Test is the name of the main' method class
System.out.println(Test.class.getDeclaredField("b").getType());

答案 1 :(得分:0)

a.getClass()。getInterfaces()为您提供包含Class类对象的Array,它表示由对象类a实现的所有接口。

即。 a.getClass()。getInterfaces()[0] .getName()为您提供 InterfaceClass

b.getClass()。getSuperclass()。getName()为您提供 AbstractClass

答案 2 :(得分:0)

这似乎是一个愚蠢的答案,但

// right here
//  |
//  v

Interface a = new C();

此外,您还添加了一个假设方法,该方法返回引用类型的名称,但

static String getReferenceType(Object o) {

    // the reality is o is always Object
    return Object.class.getName();
}

实际上并不存在基于引用类型执行某些程序逻辑的情况,因为总是知道引用的类型。这是你自己的声明。您需要调用方法或instanceof运算符的情况是当您有另一种方式时:当您不知道对象的实际类型时。

答案 3 :(得分:0)

您可以使用java.lang.Class访问方法,然后调用它们以获取不同的信息。如果您想知道哪个类基于实例化对象,您可以使用referenceVariableName.getClass();得到它的超类,referenceVariableName.getClass()。getSuperclass()来做到这一点;要知道接口,那么你可以使用referenceVariableName.getClass()。getInterfaces()[0](第一个接口,因为可能有很多接口)。

答案 4 :(得分:0)

尝试一下:

public class ObjectReferenceName {
   Interface a = new C();
   AbstractClass b = new C();
   C c =new C();
   static String getObjectReferenceName(String fieldName) throws NoSuchFieldException{
        return ObjectReferenceName.class.getDeclaredField(fieldName).getType().getName();
   }

   public static void main(String[] args) throws NoSuchFieldException {
       System.out.println(ObjectReferenceName.getObjectReferenceName("a"));
       System.out.println(ObjectReferenceName.getObjectReferenceName("b"));
       System.out.println(ObjectReferenceName.getObjectReferenceName("c"));
   }

}