INRIA SPOON getSuperinterfaces класса и получает суперкласс интерфейса - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть две проблемы:

  1. Я хотел бы извлечь список интерфейсов класса, и я использую следующий код для этого.Проблема в том, что этот код извлекает как суперклассы, так и интерфейсы, и я хотел бы извлечь только интерфейсы.Я попытался использовать код 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);
        }
    }
    
  2. Вот пример интерфейса в проекте, который я анализирую с помощью 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);
}

Не могли бы вы дать мне указания, как извлечь суперкласс интерфейса?

...