динамическое приведение в Java - PullRequest
1 голос
/ 10 января 2011

Как можно обобщить следующий код:

String nameString = "myClass_t";
myClass_t myVar = (myClass_t) AnotherClass.classMethod();

Тип возвращаемого значения AnotherClass.classMethod () необходимо получить из файла (таким образом, переменная String).Тип myVar должен соответствовать этому типу.

Как мне переписать 2-ю строку, чтобы он мог получить тип из nameString?

Большое спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Это не имеет большого смысла. Если тип myVar статически неизвестен, вы сможете использовать его только с помощью отражения. В этом случае просто сохраните его как Object.

Вы пытаетесь проверить, что classMethod() возвращает ожидаемый тип? Или вы пытаетесь привести результат к определенному типу, чтобы можно было вызывать для него определенные методы? Другими словами, что вы собираетесь делать с myVar дальше? Вызвать метод, подобный myVar.myMethod()?


Вот пример вызова метода для объекта с использованием отражения. Обратитесь к документации Class для более подробного объяснения.

Object myVar = AnotherClass.classMethod();
/* Get the class object for "myVar" to access its members. */
Class<?> myClass = myVar.getClass();
/* Find the public, no-arg method "myMethod()". */
Method mth = myClass.getMethod("myMethod");
/* Invoke "myMethod()" on "myVar", and assign result to "r". */
Object r = mth.invoke(myVar);
2 голосов
/ 10 января 2011

Используйте экземпляр Class :

Class<?> myclass = Class.forName("myClass_t");
myClass_t myVar = (myClass_t)myclass.cast(AnotherClass.classMethod());

Имейте в виду, что это может вызвать несколько исключений, например, если класс, определенный в строке, не существует или если AnotherClass.classMethod) не возвращает экземпляр класса, который вы хотите привести к.Чтобы прояснить идею интерфейса (который обычно используется для механизмов плагинов в Java):

interface Testing {
    public String getName();
}

class Foo implements Testing
{
    public String getName()
    {
        return "I am Foo";
    }
}

class Bar implements Testing
{
    public String getName()
    {
        return "I am Bar";
    }
}

// Then
Class<?> myclass = Class.forName("Foo");
Testing instance = (Testing)myclass.newInstance();
System.out.println(instance.getName()); // I am a Foo
myclass = Class.forName("Bar");
Testing instance = (Testing)myclass.newInstance();
System.out.println(instance.getName()); // I am a Bar

В основном у вас есть динамическое имя класса (например, из файла свойств).Этот класс реализует интерфейс, так что вы можете убедиться, что экземпляры класса предоставляют методы интерфейсов (вместо использования отражения для всего).

...