2011-01-10 3 views
1

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

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

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

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

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

+1

Возможно, вы захотите использовать Reflection. Но если вы больше не расскажете о том, чего вы действительно хотите достичь, вы также можете сохранить результат 'AnotherClass.classMethod()' в 'Object' и не беспокоиться о типе. –

+0

Дело в том, что я не знаю myClass_t. Я хочу переписать эту вторую строку так, чтобы она была обобщена. – Osmanthus

ответ

2

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

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

Имейте в виду, что это может бросить несколько исключений, например, если класс, определенный строкой, не существует или если AnotherClass.classMethod() не возвращает экземпляр класса, к которому вы хотите применить. Чтобы пояснить идею интерфейса (который Usally используется для плагинов механизмов 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 

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

+0

Вы не можете назначить 'Class ' 'классу '. И даже если бы вы могли, почему бы просто не использовать 'myClass_t.class'? Динамическая загрузка класса не требуется; это статический тип в вашем примере. – erickson

+0

Это не сработает, так как во второй строке нет типа 'myClass_t'. Тип 'myvar' должен быть Object или некоторым известным суперклассом/интерфейсом' myClass_t'. –

+2

Идея использования отражения, конечно, правильная. Во всяком случае, мне интересно, почему этот пример проголосовали, поскольку он не будет работать ... – Thomas

2

Это не имеет большого смысла. Если тип 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); 
+0

Тип myVar не известен статически. Я пытаюсь привести результат к определенному типу, чтобы я мог вызвать myVar.myMethod(). – Osmanthus

+0

@Osmanthus: Синтаксис 'myVar.myMethod()' требует статической типизации. Java - это статически типизированный язык. Если вы хотите динамически вызывать метод, вы должны использовать отражение. Я обновлю свой ответ, чтобы проиллюстрировать. – erickson

+0

Спасибо. Можете ли вы уточнить строку: Метод mth = clz.getMethod («myMethod»), пожалуйста? Что такое clz? вы имеете в виду myClass? – Osmanthus

Смежные вопросы