Есть задача.
Создайте способность объектов действовать как прокси вместо использования исходного поведения. Таким образом, для расширения таких функциональных возможностей реализация должна включать аннотацию для маркировки доступности класса для прокси-сервера и фабрики для получения объектов. Необходимые детали: Создайте аннотацию @Proxy. Аннотация может появляться на классах и объявляет, что класс владельца может стать прокси. Атрибуты: InvocationHandler - имя класса для использования в качестве обработчика Создайте фабричный класс. Класс используется для получения экземпляра объекта для класса, предоставленного как атрибут. Методы: GetInstanceOf (класс) - метод для получения объекта для указанного класса. Если класс имеет аннотацию @Proxy, то вместо обычного экземпляра следует использовать прокси-объект.
помогите разобраться в порядке выполнения, что за чем следует и как это должно правильно работать. Опыта мало, в голове очень плохо все складывается. Всем заранее спасибо. Буду рад любым примерам и наставлениям.
Для лучшего понимания смысла задания вот оригнал текста задачи:
0 голос «против» accept Оригинал текста задания.
Create an ability for objects to act as a proxy instead of using the original behaviour. Thus to extend such functionality an implementation should include an annotation to mark class availability to be proxy and a factory to obtain objects. Required details: Create a @Proxy annotation. The annotation may appear on classes and declares that a holder class can become proxy. Attributes: invocationHandler - a class name for using as handler Create a factory class. The class is used to get an object instance for a class provided as attribute.
Methods: getInstanceOf(Class) - a method to get an object for the specified class. If the class has the @Proxy annotation applied then a proxy object should be used instead of the common instance
Основные направления: создать фабрику, которая проверяет, есть ли на целевом классе аннотация @proxy, если есть, возвращает прокси-объект, иначе возвращает сам объект.
интерфейс
package by.tranning.ReflectionHomePartA.entities;
public interface Animals {
void voice();
}
класс прокси КОТ
package by.tranning.ReflectionHomePartA.entities;
import by.tranning.ReflectionHomePartA.annotations.Proxy;
@Proxy(invocationHandler = "tasks.reflections.annotation.handlers.ProxyAnnotationHandler")
public class Cat implements Animals {
@Override
public void voice() {
System.out.println("Mrrr-mau");
}
}
класс простых собак:
package by.tranning.ReflectionHomePartA.entities;
public class Dog implements Animals {
@Override
public void voice() {
System.out.println("Grrr-gav");
}
}
прокси класс выглядит так:
package by.tranning.ReflectionHomePartA.annotations;
import java.lang.annotation.*;
/**
*
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Proxy {
String invocationHandler();
}
Далее фабрика:
package by.tranning.ReflectionHomePartA.factories;
import by.tranning.ReflectionHomePartA.entities.Animals;
public interface AnimalsCreator {
Animals factoryMethod();
}
package by.tranning.ReflectionHomePartA.factories;
import by.tranning.ReflectionHomePartA.entities.Animals;
import by.tranning.ReflectionHomePartA.entities.Cat;
public class CatCreator implements AnimalsCreator {
@Override
public Animals factoryMethod() {
return new Cat();
}
}
package by.tranning.ReflectionHomePartA.factories;
import by.tranning.ReflectionHomePartA.entities.Animals;
import by.tranning.ReflectionHomePartA.entities.Dog;
public class DogCreator implements AnimalsCreator {
@Override
public Animals factoryMethod() {
return new Dog();
}
}
Ну и раннер
package by.tranning.ReflectionHomePartA.runner;
import by.tranning.ReflectionHomePartA.entities.Animals;
import by.tranning.ReflectionHomePartA.factories.AnimalsCreator;
import by.tranning.ReflectionHomePartA.factories.CatCreator;
import by.tranning.ReflectionHomePartA.factories.DogCreator;
public class Runner {
public static void main(String[] args) {
AnimalsCreator createAnimal = makeAnimalByName("dog");
Animals animal = createAnimal.factoryMethod();
animal.voice();
}
public static AnimalsCreator makeAnimalByName(String kindAnimal) {
if (kindAnimal.equals("dog")) {
return new DogCreator();
}
if (kindAnimal.equals("cat")) {
return new CatCreator();
}
throw new RuntimeException("This kind of anmal deas not exsist" + kindAnimal);
}
}
подскажите как теперь организовать фабрику, что бы она проверила по аннотации создается прокси объект или простой.
и как добавить сюда прокси?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Дано: 10 человек (у каждого есть яблоко)Каждый из них может отдать другому это яблоко, а может и не отдать
На главном Activity есть BottomNavigationView и еще 2 layout файла фрагментовКак реализовать переключение между этими фрагментами, чтобы при этом оставался...
Добрый день! Я дико извиняюсь за следующий глупый вопрос, но факт остается фактом, впервые за много лет работы со стилем к моему большому стыду...