值是否为null的引用类型的类型?

| 根据: http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html 4.5.2引用类型的变量 引用类型可以保存一个“ 0”引用。 当赋值为“ 0”时,是否可以检索引用类型的声明类型? 具体来说,例如,在使用反射的方法中,我希望该方法为null安全且可对原始声明的类型执行操作(尽管我知道以下代码段无效),例如:
String referenceType = null;
MyReflectionClass.reflectionMethod(referenceType);
...
public static void reflectionMethod(Object referenceType) {
   Class<?> declaredType = referenceType.getClass();
}
如果需要,我不会反对使用泛型将类型为3而不是4作为声明的参数类型。 编辑:我知道ѭ5在实例上起作用,而不是声明的类型。我想知道是否有可能要求引用它的声明类型。由于类层次结构是静态的,因此获取该信息应该没有问题。 Edit2:在这里,情况很明确:Java是“按引用传递”还是“按值传递”? Java只是按值传递,因此即使使用了引用类型,也始终将其当作传递值(对象实例)进行处理(即使内部仅传递对象指针)。这意味着Java实际上并没有一个知道它的类型的引用类型(至少就程序员而言),它全部在值实例中。 因此,不可能确定任何“ 0”值的类型。
已邀请:
一言以蔽之。但是,尝试查找null引用的成员没有任何意义,因为null表示不存在任何内容。您最好将null用作输入,最好抛出一个
NullPointerException
。 如果必须处理null,则最好的方法可能是显式地传递类引用(甚至更好的是,直接对所讨论的方法进行引用)。
public static void reflectionMethod(Object param, Class<?> referenceType) // null is dis-allowed for referenceType
{
    // ... no need to try to back-track the type from an object
}
如果您只能获得null值,则很难(除非施加其他限制,否则不可能)比幸运的猜测做得更好。
你误会了。
getClass()
不会告诉您变量的声明类型,而是告诉您对象的类型(如果有)。让我们停下来,退后一分钟-如果这样做,您将引用哪个变量?原始变量?方法参数?一路上传递的其他任何变量?那将是完全的疯狂。
您找不到“ 0”引用的声明类型。泛型也无法提供任何帮助,因为它们在编译时已被擦除。如果您需要在“ 0”情况下了解类型,则必须以某种方式在运行时传递类型。
不它不是。在您的示例中,当尝试在空引用referenceType上调用方法时,将获得空指针异常。 更具体地讲,这是不可能的,因为在编译时并不一定需要知道具体的类型,例如。如果我声明了Object类型的引用并将其分配给String,则您的方法应发现该对象是String而不是Object。
Object referenceType= new String(\"I\'m a string\");
MyReflectionClass.reflectionMethod(referenceType);
...
public static void reflectionMethod(Object referenceType) {
   Class<?> declaredType = referenceType.getClass(); // returns String.class
}
我不确定这在您的上下文中是否有帮助,但是您可以使用泛型来实现类似的功能-Java 1.5+为子类保留类型信息。
package spikes;

import java.lang.reflect.ParameterizedType;

public class ReflectMethod {
    public abstract static class GenericType<T> {
        public Class typedClass() {
            ParameterizedType pType = (ParameterizedType) getClass().getGenericSuperclass();
            return (Class) pType.getActualTypeArguments()[0];
        }

        public void reflectMethod(T o) {
            System.out.println(\"Class: \" + typedClass());
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        GenericType<String> gs = new GenericType<String>() {

        };
        gs.reflectMethod(\"\");
    }
}

要回复问题请先登录注册