У меня есть две проблемы:
Я хотел бы извлечь список интерфейсов класса, и я использую следующий код для этого.Проблема в том, что этот код извлекает как суперклассы, так и интерфейсы, и я хотел бы извлечь только интерфейсы.Я попытался использовать код if(inter.isInterface())
, но это не сработало, и я все еще получаю и интерфейсы, и суперклассы одновременно.Не могли бы вы дать мне указания о том, как извлечь только классы (не включая суперклассы) для класса?Есть ли альтернатива методу getSuperInterfaces ()?
for(CtType<?> clazz : classFactory.getAll(true)) {
String myinterfaceclassid = null;
String myinterfacename = null;
String myclassid = null;
String myclassname = null;
String FullClassName= clazz.getPackage()+"."+clazz.getSimpleName();
Set<CtTypeReference<?>> interfaces = clazz.getSuperInterfaces();
for(CtTypeReference<?> inter: interfaces) {
ResultSet interfacesnames = st.executeQuery("SELECT classname from classes where classname='"+inter+"'");
while(interfacesnames.next()) {
myinterfacename= interfacesnames.getString("classname");
}
ResultSet interfacesclasses = st.executeQuery("SELECT id from classes where classname='"+inter+"'");
while(interfacesclasses.next()) {
myinterfaceclassid= interfacesclasses.getString("id");
}
ResultSet classesnames= st.executeQuery("SELECT classname from classes where classname='"+FullClassName+"'");
while(classesnames.next()) {
myclassname= classesnames.getString("classname");
}
ResultSet interfacesname = st.executeQuery("SELECT id from classes where classname='"+FullClassName+"'");
while(interfacesname.next()) {
myclassid= interfacesname.getString("id");
}
if(myinterfaceclassid != null) {
st.executeUpdate("INSERT INTO `interfaces`(`interfaceclassid`,`interfacename`,`ownerclassid`, `classname`) VALUES ('"+myinterfaceclassid +"','" +myinterfacename+"','" +myclassid+"','" +myclassname+"')");
}
System.out.println(inter);
CtTypeReference<?> mysuperclass = inter.getSuperclass();
System.out.println("SUPERCLASS :"+ mysuperclass);
}
}
Вот пример интерфейса в проекте, который я анализирую с помощью Spoon.В этом случае интерфейсом является TransformationPly, а суперклассом - Ply.Метод getSuperInterfaces()
возвращает и суперклассы, и интерфейсы в моем случае, чего я не хочу.
public interface TransformationPly extends Ply {
// Methods
/**
* Get the new type of the piece after the transformation.
*
* @return The new piece after the transformation.
*/
byte getTypeAfterTransformation();
/**
* Set the new piece type after the transformation.
*
* @param pieceType The new piece type after the transformation.
*/
void setTypeAfterTransformation( byte pieceType);
}
Я также хотел бы извлечь суперклассы интерфейсов, как показанов приведенном выше примере.В приведенном выше случае Ply является суперклассом TransformationPly.
Я пробовал следующий код для извлечения суперкласса TransformarionPly, но mysuperclass всегда равен нулю.
for(CtType<?> clazz : classFactory.getAll(true)) {
Set<CtTypeReference<?>> interfaces = clazz.getSuperInterfaces();
for(CtTypeReference<?> inter: interfaces) {
CtTypeReference<?> mysuperclass = inter.getSuperclass();
System.out.println("SUPERCLASS :"+ mysuperclass);
}
Не могли бы вы дать мне указания, как извлечь суперкласс интерфейса?