Часто виникає необхідність під час виконання java класу отримати дані про цей же або інший клас. Це можна здійснити за допомогою Reflection API.
Reflection API в Java використовується для перегляду інформації про класи, інтерфейси, методи, поля, конструктори, анотації під час виконання java програм. При цьому знати назви досліджуваних елементів заздалегідь не обов'язково. Усі класи для роботи з reflection розташовані в пакеті java.lang.reflect.
Reflection API в Java використовується для перегляду інформації про класи, інтерфейси, методи, поля, конструктори, анотації під час виконання java програм. При цьому знати назви досліджуваних елементів заздалегідь не обов'язково. Усі класи для роботи з reflection розташовані в пакеті java.lang.reflect.
За допомогою інтерфейсу Java Reflection API можна робити наступне:
- Визначити клас об'єкту.
- Отримати інформацію про модифікатори класу, поля, методи, конструктори і суперкласи.
- З'ясувати, які константи і методи належать інтерфейсу.
- Створити екземпляр класу, ім'я якого невідоме до моменту виконання програми.
- Отримати і встановити значення властивості об'єкту.
- Викликати метод об'єкту.
- Створити новий масив, розмір і тип компонентів якого невідомі до моменту виконання програм.
public
class
People
implements
Serializable {
private
String name;
private
int
age;
public
String getName(){
return
this
.name;
}
public
int
getAge(){
return
this
.age;
}
public
void
setName(String name){
this
.name = name;
}
public
void
setAge(
int
age){
this
.name = age;
}
@Deprecated
protected
static
void
method(String[] params) { }
}
People people =
new
People();
Class myClass = people.getClass();
Найпростіше, що зазвичай робиться в динамічному програмуванні, - це отримують об'єкт типу java.lang.Class.
Якщо є екземпляр об'єкту Class, то можна отримати будь-яку інформацію про цей клас і навіть здійснювати операції над ним. Наведений вище методgetClass () часто корисний тоді коли є екземпляр об'єкту, але не відомо якого класу цей екземпляр.
Якщо є клас, для якого у момент компіляції відомий тип, то отримати екземпляр класу ще простіше.
Class myClass = People.
class
;
Якщо ім'я класу невідоме у момент компіляції, але стає відомим під час виконання програми, можна використати метод forName (), щоб отримати об'єкт
Class c = Class.forName(
"com.mysql.jdbc.Driver"
);
Отримання пакету
Package p = class.getPackage();
System.out.println(
"package "
+ p.getName() +
";"
);
Виводимо інтерфейси, які реалізує клас
Class[] interfaces = myClass.getInterfaces();
for
(
int
i =
0
, size = interfaces.length; i < size; i++) {
System.out.print(i ==
0
?
"implements "
:
", "
);
System.out.print(interfaces[i].getSimpleName());
}
System.out.println(
" {"
);
Виводимо поля класу
}
Виводимо методи, анотації класу
Field[] fields = class.getDeclaredFields();
for
(Field field : fields) {
System.out.println(
"\t"
+ getModifiers(field.getModifiers()) +
getType(field.getType()) +
" "
+ field.getName() +
";"
);
Виводимо методи, анотації класу
Method[] methods = class.getDeclaredMethods();
for
(Method m : methods) {
Annotation[] annotations = m.getAnnotations();
System.out.print(
"\t"
);
for
(Annotation a : annotations)
System.out.print(
"@"
+ a.annotationType().getSimpleName() +
" "
);
System.out.println();
System.out.print(
"\t"
+ getModifiers(m.getModifiers()) + getType(m.getReturnType())
+
" "
+ m.getName() +
"("
);
System.out.print(getParameters(m.getParameterTypes()));
System.out.println(
") { }"
);
}