Class c1 = object.getClass();
How research class?
How create classes in runtime?
Reflection API
Reflection API — API для получения информации об объектах и их классах в runtime.
Центральный класс — java.lang.reflect.Class
.
Для каждого класса, загруженного в JVM, можно получить описывающий его экземпляр класса Class
Class
Class
С помощью Class
можно осуществить:
Получение списка конструкторов, методов и полей класса.
Создание экземпляров класса.
Вызов методов и чтение/запись полей, в том числе закрытых.
Но нельзя получить содержимое метода.
Получение класса по объекту:
Class c1 = object.getClass();
Получение класса через литерал:
Class c2 = String[].class;
Загрузка класса по имени:
Class c3 = Class.forName("java.lang.Integer");
Можно загрузить класс из файловой системы или сети в runtime:
URL jarFileURL = new URL ("file://interface-impl.jar");
ClassLoader classLoader =
new URLClassLoader(new URL [] { jarFileURL });
Class c4 = classLoader.loadClass("by.rakovets.InterfaceImpl");
public class CustomClassLoader extends ClassLoader {
protected Class <?> findClass(String name) {
byte []b = getClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte [] getClassData(String name) {
// code that returns contents of java class (file)
}
}
Class
Method | int[] | Object[] | Foo.Bar |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
isArray(): boolean
isInterface(): boolean
isPrimitive(): boolean
getSuperclass(): Class<?>
getInterfaces(): Class<?>[]
getPackage(): Package
- возвращает пакет.
getModifiers(): int
- возвращает модификаторы класса.
Not private
constructor
getConstructor(Class… types): Constructor
getConstructors(): Constructors<?>[]
All constructors:
getDeclaredConstructor(Class… types): Constructor
getDeclaredConstructors(): Constructors<?>[]
Constructor constructor = clazz.getConstructor(String.class);
Object instance = constructor.newInstance(" Hello World !");
Открытые методы, в том числе унаследованные:
getMethod(String name, Class… types): Method
getMethods(): Method[]
Все методы, но только из текущего класса:
getDeclaredMethod(String name, Class… types): Method
getDeclaredMethods(): Method[]
Method method = clazz.getMethod ("doSomething", int.class);
Object result = method.invoke(instance, 42);
Открытые поля, в том числе унаследованные:
getField(String name): Field
getFields(): Field[]
Все поля, но только из текущего класса:
getDeclaredField(String name): Field
getDeclaredFields(): Field[]
getAnnotations(): Annotation[]
getDeclaredAnnotations(): Annotation[]
Annotation[] annotations = studentClass.getAnnotations();
Arrays.stream(annotations)
.map(a -> a.annotationType().getCanonicalName())
.forEach(System.out::println);