如果对象 class 是使用 java 反射的字段数组,则无法获取包和 class 名称
cannot get package and class name if object class is array on field using java reflection
我有一些问题。
class example{
Text text=new Text();
int a;
JLabel[] label=new JLabel[3];
Panel[][][] panel=new Panel[5][5][5];
}
所以,我试过反思:
Class cls=Class.forName("example");
Field[]f=cls.getDeclaredFields();
for(field : f){
field.getType().getPackage();
field.getType().getName();
}
包的结果为空,class 的结果类似于 [[[Ljava.awt.Panel
数组是一种特殊类型。它不属于任何包。
尝试(未测试):
Class cls=Class.forName("example");
Field[]f=cls.getDeclaredFields();
for(Field field : f){
Class<?> type = field.getType()
int numArrayDimensions= 0;
while (type.isArray()){
type = type.getComponentType();
numArrayDimensions++;
}
if (! type.isPrimitive()){
Package pkg = type.getPackage();
}
String className = getFormattedClassName(type, numArrayDimensions);
}
private String getFormattedClassName(Class<?> type, int numArrayDimensions){
StringBuilder sb = new StringBuilder(type.getName());
IntStream.range(0, numArrayDimensions).foreach(dimension -> sb.append("[]"));
return sb.toString();
}
另一方面,原语是一种语言特征。代表它们的 class 个对象不属于任何包。
尝试使用以下代码获取包名
Package p=cls.getPackage();
System.out.println(p.getName());
我试过示例程序
Class cls=Countcharacters.class;
Package p=cls.getPackage();
System.out.println(p.getName());
并以 Sflow 的形式输出,这是我的包名
根据您的评论,我假设您想要实现的是按照在 class 中声明的类似方式打印字段类型。所以如果 class 喜欢
class Example {
int a;
int[][] f;
JLabel[][] label = new JLabel[3][];
String s;
}
你想得到
int
int[][]
javax.swing.JLabel[][]
java.lang.String
然后在 Field
表示已声明字段的实例上使用 field.getType().<b>getTypeName()</b>
。
field.getType()
将returnClass表示字段可以存储什么类型,
- 和
getTypeName()
return 的名称易于阅读,因此对于字段 int[][] f;
,您将得到 int[][]
而不是 [[I
。
演示:
class Example {
int a;
int[][] f;
JLabel[][] label = new JLabel[3][];
String s;
}
class Demo {
public static void main(String[] ar) {
Class<?> cls = Example.class;
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getType().getTypeName());
}
}
}
我有一些问题。
class example{
Text text=new Text();
int a;
JLabel[] label=new JLabel[3];
Panel[][][] panel=new Panel[5][5][5];
}
所以,我试过反思:
Class cls=Class.forName("example");
Field[]f=cls.getDeclaredFields();
for(field : f){
field.getType().getPackage();
field.getType().getName();
}
包的结果为空,class 的结果类似于 [[[Ljava.awt.Panel
数组是一种特殊类型。它不属于任何包。
尝试(未测试):
Class cls=Class.forName("example");
Field[]f=cls.getDeclaredFields();
for(Field field : f){
Class<?> type = field.getType()
int numArrayDimensions= 0;
while (type.isArray()){
type = type.getComponentType();
numArrayDimensions++;
}
if (! type.isPrimitive()){
Package pkg = type.getPackage();
}
String className = getFormattedClassName(type, numArrayDimensions);
}
private String getFormattedClassName(Class<?> type, int numArrayDimensions){
StringBuilder sb = new StringBuilder(type.getName());
IntStream.range(0, numArrayDimensions).foreach(dimension -> sb.append("[]"));
return sb.toString();
}
另一方面,原语是一种语言特征。代表它们的 class 个对象不属于任何包。
尝试使用以下代码获取包名
Package p=cls.getPackage();
System.out.println(p.getName());
我试过示例程序
Class cls=Countcharacters.class;
Package p=cls.getPackage();
System.out.println(p.getName());
并以 Sflow 的形式输出,这是我的包名
根据您的评论,我假设您想要实现的是按照在 class 中声明的类似方式打印字段类型。所以如果 class 喜欢
class Example {
int a;
int[][] f;
JLabel[][] label = new JLabel[3][];
String s;
}
你想得到
int
int[][]
javax.swing.JLabel[][]
java.lang.String
然后在 Field
表示已声明字段的实例上使用 field.getType().<b>getTypeName()</b>
。
field.getType()
将returnClass表示字段可以存储什么类型,- 和
getTypeName()
return 的名称易于阅读,因此对于字段int[][] f;
,您将得到int[][]
而不是[[I
。
演示:
class Example {
int a;
int[][] f;
JLabel[][] label = new JLabel[3][];
String s;
}
class Demo {
public static void main(String[] ar) {
Class<?> cls = Example.class;
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getType().getTypeName());
}
}
}