Это 27-й день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов
Я помню, я написал статью о json to entity раньше
Помнится, я раньше писал статью про json to entity, в которой использовалось java-рефлексия, но про рефлексию я тогда только узнал, а глубокого понимания у меня не было, на зимних каникулах делать было нечего. резюме личных размышлений об обучении. Если у вас его нет, вы также можете попросить Бога о руководстве! ! !
Рефлексия, как следует из названия, является процессом, противоположным компиляции Java.Эффект здесь заключается в создании экземпляров объектов класса и управлении классами через имена классов. Подробнее
Получить родительский класс и все интерфейсы
-
Во-первых, наш класс Java может наследовать и реализовывать несколько интерфейсов, так как же нам получить родительский класс и интерфейс класса Java через отражение Java?
-
Сначала мы создаем новый класс Animal в качестве родительского класса.
public class Annimal {
private String AnnimalName;
public void eat(){
System.out.println("Annimal is eatting");
}
public void run(){
System.out.println("Annimal is running");
}
}
- Затем создайте новый интерфейс Behavior.
public interface Behaviour {
public String haviour="test";
public void sayHello();
public void isAngury();
public void love();
}
- Теперь давайте создадим новый класс Dog и позволим классу Dog унаследовать класс Annimal и реализовать интерфейс Behavour.
public class Dog extends Annimal implements Behaviour
- Исходный код собаки
public class Dog extends Annimal implements Behaviour{
private String dogName;
public void fuck(String name){
System.out.println("fuck To : "+name);
}
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("Dog sayHello");
}
@Override
public void isAngury() {
// TODO Auto-generated method stub
System.out.println("Dog isAngury");
}
@Override
public void love() {
// TODO Auto-generated method stub
System.out.println("Dog love");
}
}
-
контрольная работа
-
Давайте начнем тест.Во-первых, мы используем класс Class, чтобы получить объект класса класса
Class<?> target=Class.forName("tom.change.Reflect.获取父类和所有接口.Dog");
- Затем вы можете получить родительский класс и все интерфейсы через два метода getSuperClass и getInterfaces.
//获取Dog类的父类
Class<?> parent=target.getSuperclass();
//获取该类继承的所有类
Class<?> intefaces[]=target.getInterfaces();
- Наконец, посмотрите на диаграмму эффектов работы программы.
Получить все свойства (getDeclaredFields)
- В классе Java существуют отношения между классами, и каждый класс имеет определенные атрибуты, так как же мы можем получить атрибуты в классе Java посредством отражения? Ниже я написал пользовательский класс со свойствами как
Класс собаки:
private String dogName;
- Итак, давайте попробуем посмотреть, сможем ли мы получить вышеуказанные свойства. Также получите объект класса через путь к классам
Class<?> clazz=Class.forName("tom.change.Reflect.获取父类和所有接口.Dog");
- Затем получить свойства локального класса через метод getDeclaredFields объекта класса.Этот метод не может получить свойства унаследованного родительского класса и интерфейса.Если вам нужно его получить, вы можете сначала получить родительский класс через этот класс, и затем перейдите, чтобы получить класс объекта родительского класса, перейдите, чтобы получить свойства в родительском классе.
for (int i = 0; i < fields.length; i++) {
//获取字段的修饰权限符
System.out.println(Modifier.toString(fields[i].getModifiers())+"@@@"+fields[i].getName());
}
-
Позвольте мне рассказать об этом здесь.После его получения используйте Field, чтобы принять его.Этот класс getModifiers получает свойства свойства, частные, общедоступные или защищенные.
-
После того, как здесь получено поле, свойство может быть установлено с помощью метода set поля вне зависимости от внешнего состояния свойства. Предпосылка заключается в том, что разрешение включено
field.setAccessible(true);
field.set(object, "21131084");
- Объект здесь является экземпляром объекта класса
Получить все методы класса (getMethods)
- Если выше мы получили все свойства в классе, то естественно получим все методы в классе. Те же шаги уже есть, и я не буду их здесь повторять, но отличие от вышеописанного в том, что мы вызываем метод getMethods уже после получения объекта класса.
public void tom.change.Reflect.获取父类和所有接口.Dog.fuck(java.lang.String)
public void tom.change.Reflect.获取父类和所有接口.Dog.sayHello()
public void tom.change.Reflect.获取父类和所有接口.Dog.love()
public void tom.change.Reflect.获取父类和所有接口.Dog.isAngury()
public void tom.change.Reflect.获取父类和所有接口.Annimal.run()
public void tom.change.Reflect.获取父类和所有接口.Annimal.eat()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
- У вас есть сомнения, почему какие-то необъяснимые методы появляются, а какие-то методы даже не появились в наших классах Dog и унаследованных, что происходит? Сначала getMethods получает методы самого класса, это точно. Мы также можем получить унаследованные классы, что объясняет, почему в наших методах доступа есть методы класса Animal. Так откуда же берутся методы класса Object Вы помните, что все классы наследуют класс Object?
Вызов метода в классе (getMethod)
- После того, как мы получили метод выше, мы получаем указанный метод через getMethod, который возвращает объект Method, а затем вызываем указанный метод через метод вызова в методе. При вызове вам нужно передать объект усиления класса, и если есть параметры, нам также нужно передать параметры.
public Object invoke(Object obj, Object... args)
-
Исходный код показывает, что здесь передается столько параметров, сколько нужно методу, что здесь обычно.
-
При получении метода через getMethod нам нужно передать тип параметра метода
```
public Object invoke(Object obj, Object... args)
```
```
public Method getMethod(String name, Class<?>... parameterTypes)
```
Получить все конструкторы (getConstructors)
- В классе Java должна остаться функция-конструктор, так как это отражение, нам нужно высушить отражение класса. После получения объекта класса мы получаем конструктор через getConstructors, который возвращает коллекцию Constructor. В классе Constructor getParameterTypes получает параметры в конструкторе, благодаря чему мы можем сами сконструировать класс.
Суммировать
- На этом этапе наше отражение может полностью управлять классом. Некоторые люди спросят, что это значит: в нашем веб-сайте Java, исходный код которого должен иметь отражение, мы можем реализовать функцию аннотации через отражение. Конечно, в аннотациях есть и другие знания, которые будут введены позже. В другом примере, когда мы сопоставляем карту с сущностью, нам нужна область отражения, чтобы получить свойства в Java Bean и присвоить значение карты. В любом случае отражение — это важное знание нашей Java, и его изучение очень поможет нам в наших будущих архитектурных тестах.