Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取实例的对象引用类型?_Java_Types_Classname_Object Reference - Fatal编程技术网

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

Java 如何获取实例的对象引用类型?,java,types,classname,object-reference,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(

给定一个接口、一个抽象类和一个具体类

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
/* 它返回对象引用的类名 */

如何获取引用类型的类名

即—

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

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

要获取名称,请尝试

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

interface testPackage.InterfaceClass
class testPackage.AbstractClass
如果要检查对象是否是类的实例,请尝试
instanceof

编辑:

interface testPackage.InterfaceClass
class testPackage.AbstractClass
如果要获取声明变量的类型,可以使用反射。如果这些字段是字段,换句话说,如果它们被声明为类字段,没有局部变量,那么这是有效的

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());
a.getClass().getInterfaces()提供包含类的对象的数组,该类对象表示由对象a的类实现的所有接口

i、 e.a.getClass().getInterfaces()[0].getName()为您提供接口类

interface Interface {
}

abstract class AbstractClass {
}

class C extends AbstractClass implements Interface {
}

b.getClass().getSuperclass().getName()为您提供了抽象类

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

interface Interface {
}

abstract class AbstractClass {
}

class C extends AbstractClass implements Interface {
}
// right here
//  |
//  v

Interface a = new C();
此外,还添加了一个假设方法,该方法返回引用类型的名称,但

static String getReferenceType(Object o) {

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

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

您可以通过java.lang.Class访问方法,然后调用它们以获取不同的信息。如果您想知道实例化对象基于哪个类,可以使用referenceVariableName.getClass();要获取其超类,请参考VariableName.getClass().getSuperclass();要了解接口,您可以使用referenceVariableName.getClass().getInterfaces()[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"));
   }

}

a
b
字段、方法参数、局部变量等?a和b是参考变量。您可以使用instanceof运算符检查引用类型。@SaurabhSharma OP需要声明的变量类型,而不是运行时类型。请注意,您一直在引用“名称”,而实际上似乎需要的是“类型”。请将其称为“类型”,以便人们不会感到困惑!你的
抽象类
没有实现你的
接口
,这是故意的吗?@SSaMKJ你误解了。您知道
a
是一个
接口
引用,因为您的声明中说
接口a
。你不需要调用一个方法来找出答案。在申报单上。哦。。。很抱歉它返回java.lang.ObjectI需要这个程序逻辑。因为,我正在用反射构造函数创建一个类。对于implements和extends,可以使用相同的参数长度但不同类型的构造函数。无论如何,谢谢您的考虑和回复。您不需要任何特殊的东西就可以获得具有特定参数的构造函数。有一种方法:。你似乎不认为。我现在遇到了问题。使用参数类型构造。。。所以我需要引用对象的特定类型。