将实例作为对象传递并 getClass() returns java.lang.Class

Passing instance as object and getClass() returns java.lang.Class

我正在尝试获取已传递对象的 class 名称。但是 Object#getClass() 只是 returns java.lang.Class。这是一个示例,其中 obj 是 net.minecraft.server.v1_8_R1.IChatBaseComponent:

的一个实例
System.out.println("logging x2: " + obj.getClass()); // class java.lang.Class

为什么会这样,我该如何解决。不,我不能使用 newInstanceinstanceofisAssignableFrom,因为整个方法用于确定传递对象的 class 名称。

完整的方法如下所示:

public Method getMethod(String name, Class<?>... paramTypes) throws Exception {
    Class<?>[] types = toPrimitiveTypeArray(paramTypes, false);

    for (Method method : this.getClazz().getMethods()) {
        Class<?>[] methodTypes = toPrimitiveTypeArray(method.getParameterTypes(), true); // here is where it logs

        if (method.getName().equals(name) && isEqualsTypeArray(methodTypes, types)) {
            method.setAccessible(true);
            return method;
        }
    }

    System.out.println(StringUtil.format("The method {0} was not found with parameters {1}!", name, Arrays.asList(types)));
    return null;
}

private static Class<?>[] toPrimitiveTypeArray(Object[] objects, boolean log) {
    Class<?>[] types = new Class<?>[objects != null ? objects.length : 0];

    for (int i = 0; i < types.length; i++) {
        if (log) System.out.println("logging x1: " + objects[i]); // interface net.minecraft.server.v1_8_R1.IChatBaseComponent
        if (log) System.out.println("logging x2: " + objects[i].getClass()); // class java.lang.Class
        if (log) System.out.println("logging x3: " + objects[i].getClass().getName()); // java.lang.Class
        types[i] = getPrimitiveType(objects[i].getClass()); // This just swaps out primitives for their class-versions, or returns the passed class, the problem happens before this
    }

    return types;
}

objects[i].getClass().getName() 应该可以。

看来这就是你想要的。

private static Class<?>[] toPrimitiveTypeArray(
//      vvvvvvvv
        Class<?>[] objects, boolean log) {
    ...

    for (int i = 0; i < types.length; i++) {
        ...
        //                          vvvvvvvvvv
        types[i] = getPrimitiveType(objects[i]);
    }
    ...
}

getParameterTypes 已经 returns 一个 Class 的数组,您正在隐式向上转换为 Object.

或者您现在可能想做 getPrimitiveType(objects[i].getName())。 (但是你的描述对我来说不是很清楚,所以我不能肯定。)

I'm trying to get the class name of a passed Object

    private static void toPrimitiveTypeArray(Object[] objects, boolean log) {
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i].getClass().getSimpleName());
    }

如果您只想 return 对象数组中 类 的所有 Class 名称。