Вам нужно использовать Отражение . Некоторое время назад я написал некоторые утилиты тегов JSTL, которые делают подобные вещи. Одна функция проверяет, является ли класс экземпляром переданной строки (instanceof
в основном). Другой проверяет, имеет ли класс указанное свойство (hasProperty
). Следующий фрагмент кода должен помочь:
//Checks to see if Object 'o' is an instance of the class in the string "className"
public static boolean instanceOf(Object o, String className) {
boolean returnValue;
try {
returnValue = Class.forName(className).isInstance(o);
}
catch(ClassNotFoundException e) {
returnValue = false;
}
return returnValue;
}
//Checks to see if Object 'o' has a property specified in "propertyName"
public static boolean hasProperty(Object o, String propertyName) {
boolean methodFound = false;
int i = 0;
Class myClass = o.getClass();
String methodName = "get" + propertyName.toUpperCase().charAt(0) + propertyName.substring(1);
Method[] methods = myClass.getMethods();
while(i < methods.length && !methodFound) {
methodFound = methods[i].getName().compareTo(methodName) == 0;
i++;
}
return methodFound;
}
Обратите особое внимание на метод Class.forName
в первом методе (который загружает и инициализирует класс) и метод getMethods()
во второй функции, который возвращает все методы, определенные для класса.
Что вы, вероятно, хотите, это Class.forName
, который также инициализирует класс. После этого вы можете использовать newInstance
, чтобы получить новый экземпляр этого класса (если он вам нужен). Для доступа к полям вам необходимо использовать Method
объекты, которые вы получили от getMethod()
. Используйте метод invoke
для этих объектов. Если эти методы являются методами получения, то теперь у вас есть доступ к нужному полю.
EDIT
Посмотрев на код в вашем вопросе, я понял, что вам нужны геттеры и сеттеры для этих атрибутов. Итак, предположим, что вы определили getABC
и getXYZ
, вот несколько надуманный пример:
public Object reflectionDemo(String className, String getter) throws ClassNotFoundException, NoSuchMethodException {
Object fieldValue;
Class myClass = Class.forName(className);
Object myClassInstance = myClass.newInstance(); //to get an instance of the class
if(myClassInstance instanceof My_Class_X123) {
//null because we are not specifying the kind of arguments that class takes
Method getterMethod = myClass.getMethod(getter, null);
//null because the method takes no arguments
//Also in the scenario that the method is static one, it is not necessary to pass in an instance, so in that case, the first parameter can be null.
fieldValue = getterMethod.invoke(myClassInstance, null);
}
return fieldValue;
}
Вышеуказанный подход является более общим. Если вам нужны только поля, вы можете использовать метод, описанный Джеймсом:
myClass = null;
try {
myClass = Class.forName(className);
Field[] fields = myClass.getDeclaredFields();
for(Field field : fields) {
//do whatever with the field. Look at the API reference at http://java.sun.com/javase/6/docs/api/java/lang/reflect/Field.html
}
}
catch(Exception e) {
//handle exception
}