Эмуляция Java Reflection с отложенным связыванием GWT - PullRequest
0 голосов
/ 09 августа 2011

Вот мой код: Мой модуль содержит:

<generate-with class="com.bilancio.ReflectionGenerator"> 
  <when-type-assignable class="com.bilancio.client.Reflection" /> 
</generate-with> 

public interface Constructable {} 


public interface Reflection { 
    public <T> T instantiate( String className ); 
}


public class ReflectionGenerator extends Generator 
{ 
    @Override 
    public String generate( TreeLogger logger, GeneratorContext 
context, String typeName ) throws UnableToCompleteException 
    { 
        TypeOracle oracle = context.getTypeOracle( ); 
        JClassType markerInterface = 
oracle.findType( Constructable.class.getName( ) ); 
        List<JClassType> clazzes = new ArrayList<JClassType>( ); 
        PropertyOracle propertyOracle = context.getPropertyOracle( ); 
        for ( JClassType classType : oracle.getTypes( ) ) 
        { 
            if ( !classType.equals( markerInterface ) && 
classType.isAssignableTo( markerInterface ) ) 
                clazzes.add( classType ); 
        } 
        final String genPackageName = "com.bilancio.client"; 
        final String genClassName = "ReflectionImpl"; 
        ClassSourceFileComposerFactory composer = new 
ClassSourceFileComposerFactory( genPackageName, genClassName ); 
composer.addImplementedInterface( Reflection.class.getCanonicalName( ) ); 
        composer.addImport( "com.bilancio.client.*" ); 
        PrintWriter printWriter = context.tryCreate( logger, 
genPackageName, genClassName ); 
        if ( printWriter != null ) 
        { 
            SourceWriter sourceWriter = 
composer.createSourceWriter( context, printWriter ); 
            sourceWriter.println( "ReflectionImpl( ) {" ); 
            sourceWriter.println( "}" ); 
            printFactoryMethod( clazzes, sourceWriter ); 
            sourceWriter.commit( logger ); 
        } 
        return composer.getCreatedClassName( ); 
    } 
    private void printFactoryMethod( List<JClassType> clazzes, 
SourceWriter sourceWriter ) 
    { 
        sourceWriter.println( ); 
        sourceWriter.println( "public <T> T instantiate( String 
className ) {" ); 
        for ( JClassType classType : clazzes ) 
        { 
            if ( classType.isAbstract( ) ) 
                continue; 
            sourceWriter.println( ); 
            sourceWriter.indent( ); 
            sourceWriter.println( "if( className.equals(\"" + 
classType.getName( ) + "\")) {" ); 
            sourceWriter.indent( ); 
            sourceWriter.println( "return new " + 
classType.getQualifiedSourceName( ) + "();" ); 
            sourceWriter.outdent( ); 
            sourceWriter.println( "}" ); 
            sourceWriter.outdent( ); 
            sourceWriter.println( ); 
        } 
        sourceWriter.println( ); 
        sourceWriter.outdent( ); 
        sourceWriter.println( "}" ); 
        sourceWriter.outdent( ); 
        sourceWriter.println( ); 
    } 
} 

Я хочу использовать это так:

GWT.create (Reflection.class)). Instantiate ("MyPanel")

Класс MyPanel, очевидно, реализует интерфейс Construable.

Я продолжаю получать:

Несоответствие типов: невозможно преобразовать из MyPanel в T

Что вы думаете?

изм:

Я изменил эту строку, пытаясь выполнить непроверенное приведение, но все равно ошибка:

sourceWriter.println( "return (T) new " + classType.getQualifiedSourceName( ) + "();"); 

А вот и мой след:

[DEBUG] [main] - Rebinding com.bilancio.client.Reflection
    [DEBUG] [main] - Adding '1' new generated units
        [DEBUG] [main] - Validating newly compiled units
            [ERROR] [main] - Errors in 'generated://670356D9DA0D417BB8171499B4C4D57B/com/bilancio/client/ReflectionImpl.java'
                [ERROR] [main] - Line 9: This method must return a result of type T
                [INFO] [main] - See snapshot: /tmp/com.bilancio.client.ReflectionImpl6488844579312624283.java

1 Ответ

0 голосов
/ 09 августа 2011

Решено здесь: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/197feee215b80533

Мне не хватало возвращаемого значения по умолчанию ^ _ ^

...