将实例作为对象传递并 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
为什么会这样,我该如何解决。不,我不能使用 newInstance
或 instanceof
或 isAssignableFrom
,因为整个方法用于确定传递对象的 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 名称。
我正在尝试获取已传递对象的 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
为什么会这样,我该如何解决。不,我不能使用 newInstance
或 instanceof
或 isAssignableFrom
,因为整个方法用于确定传递对象的 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 名称。