我有一些问题。
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();
}
package的结果为null,类的结果如[[[Ljava.awt.Panel
答案 0 :(得分:2)
数组是一种特殊类型。它不属于任何包。
尝试(未经测试):
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();
}
另一方面,基元是一种语言特征。表示它们的类对象不属于任何包。
答案 1 :(得分:1)
根据您的评论,我假设您要实现的目的是以类似于在类中声明的方式打印字段类型。所以,如果对于类
public partial class MyForm : Form
{
private MyModel Model;
public MyForm(MyModel model)
{
InitializeComponent();
Model = model;
// Create our bindings
dtpDate.DataBindings.Add(new Binding("Value", Model,
this.GetPropertyName((MyModel x) => x.ProxyWhenDate)));
dtpTime.DataBindings.Add(new Binding("Value", Model,
this.GetPropertyName((MyModel x) => x.ProxyWhenTime)));
}
}
你想得到
class Example {
int a;
int[][] f;
JLabel[][] label = new JLabel[3][];
String s;
}
然后在int
int[][]
javax.swing.JLabel[][]
java.lang.String
实例上表示声明的字段使用Field
。
field.getType().getTypeName()
将返回表示可以在字段中存储的类型的类,field.getType()
以易于理解的形式返回姓名,因此对于字段getTypeName()
,您将获得int[][] f;
而不是int[][]
。演示:
[[I
答案 2 :(得分:-1)
尝试使用以下代码获取包名称
Package p=cls.getPackage();
System.out.println(p.getName());
我尝试过示例程序
Class cls=Countcharacters.class;
Package p=cls.getPackage();
System.out.println(p.getName());
并以Sflow的形式获得了我的包名