Reflexion API显示任何Java数组类都实现了接口java.lang.Cloneable和java.io.Serializable。它没有声明任何成员。
我的问题是:
这个'长度'定义在哪里?
使用公共访问覆盖受保护的Object clone()的位置 说明符使用co-variant返回类型(byte []替换Object) 可以直接将其分配给字节[]?
另外,byte []类的访问说明符包含“abstract final”,它不是Java中任何类或方法的合法组合。
import java.lang.reflect.*;
public class ArrayExplorer {
public static void main(String[] args) {
explore("Current class:", byte[].class);
byte[] bytes = { 65, 'A' };
System.out.println(bytes.length);
byte[] cloned = bytes.clone();
System.out.println(cloned);
}
private static void explore(String msg, Class<?> class1) {
if (class1 == null)
return;
System.out.println("**************************************\n" + msg
+ Modifier.toString(class1.getModifiers()) + " " + class1);
// if (class1 == Object.class)
// return;
Field[] fields = class1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
Method[] methods = class1.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
explore("Superclass:", class1.getSuperclass());
explore("Classes:", class1.getClasses());
explore("ComponentType:", class1.getComponentType());
explore("DeclaredClasses:", class1.getDeclaredClasses());
explore("DeclaringClass:", class1.getDeclaringClass());
explore("EnclosingClass:", class1.getEnclosingClass());
if (!class1.isInterface()) {
explore("Interfaces:", class1.getInterfaces());
}
}
private static void explore(String msg, Class<?>[] classes) {
if (classes == null || classes.length == 0)
return;
System.out.println(msg);
for (Class<?> class1 : classes) {
explore("", class1);
}
}
}
答案 0 :(得分:0)
java中的数组有点像原语:虽然有Array.class
来表示它,但它实际上没有“代码”,因为类型是内置于语言中的,所以它的字段像length
等不能通过反思来访问。
答案 1 :(得分:0)
的JavaDoc
getDeclaredMethods
返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。 如果类或接口没有声明字段,或者此Class对象表示基本类型,数组类或void,则此方法返回长度为0的数组。
getDeclaredMethods
返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。 如果类或接口没有声明字段,或者此Class对象表示基本类型,数组类或void,则此方法返回长度为0的数组。