字段和方法描述符由运行时用于链接类。因此,它们应该可以通过反射获得。我需要它们在运行时创建java类。基于通过Class.getName()等方法获得的信息重构描述符的唯一方法是什么?这些方法返回的几乎是字段的描述符,但不是完全的描述符。
获得描述符的最简单方法似乎是实现从通过反射获得的信息中派生信息的方法。
static String getDescriptorForClass(final Class c)
{
if(c.isPrimitive())
{
if(c==byte.class)
return "B";
if(c==char.class)
return "C";
if(c==double.class)
return "D";
if(c==float.class)
return "F";
if(c==int.class)
return "I";
if(c==long.class)
return "J";
if(c==short.class)
return "S";
if(c==boolean.class)
return "Z";
if(c==void.class)
return "V";
throw new RuntimeException("Unrecognized primitive "+c);
}
if(c.isArray()) return c.getName().replace('.', '/');
return ('L'+c.getName()+';').replace('.', '/');
}
static String getMethodDescriptor(Method m)
{
String s="(";
for(final Class c: m.getParameterTypes())
s+=getDescriptorForClass(c);
s+=')';
return s+getDescriptorForClass(m.getReturnType());
}
ASM的Type
有getDescriptor
和getMethodDescriptor
。
String desc = Type.getMethodDescriptor(method);
与其创建和传递字符串,不如使用java.lang.constant
包中的接口来实现此目的。
参见ClassDesc
, ConstantDescs
, MethodTypeDesc
等
这些接口包含静态工厂方法,这些方法实例化完成工作的包私有类。
java.lang.Class
有一个describeConstable()
方法,你可以用它作为起点。