У меня есть класс Учитель, у которого есть две переменные, одна из них - это класс учеников, а другой - объект класса Студент. Я перехватываю класс Учителя согласно моему пониманию, все предметы, находящиеся в классе Учителя, должны иметь прикрепленный к нему перехватчик. так, например, мы вызываем метод getter на переменную Student, полученной из класса Учителя или из списка. Его следует вызвать, чтобы метод перехвата не вызывался. Это делает нашу аксиому для дизайна false. Так что мой вопрос: есть ли мы можем автоматически перехватить все объекты, объявленные в классе, и это может распространиться на дальнейшую иерархию вниз внутри дерева? Ниже приведен код:Есть ли способ разместить декоратор/перехватчик на всех объектах, объявляемых как поле класса?
//Teacher class
package com.anz.interceptorproject;
import java.util.ArrayList;
import java.util.List;
/**
* Created by mehakanand on 4/24/16.
*/public class Teacher {
private String userName;
private String cource;
private List<Student> students=new ArrayList<Student>();
public Student getComplexObjectStudent() {
return complexObjectStudent;
}
public void setComplexObjectStudent(Student complexObjectStudent) {
this.complexObjectStudent = complexObjectStudent;
}
private Student complexObjectStudent=new Student();
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getCource() {
return cource;
}
public void setCource(String cource) {
this.cource = cource;
}
}
//Student Class
package com.anz.interceptorproject;
/**
* Created by mehakanand on 4/24/16.
*/public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//Interceptor Class
package com.anz.interceptorproject.change;
import java.lang.reflect.*;
import net.sf.cglib.proxy.*;
/**
* Created by mehakanand on 4/24/16.
*/
public class ClassFacadeCglib implements MethodInterceptor{
private Object target;
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// callback method
enhancer.setCallback(this);
// create proxy object
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
Object res=null;
if(method.getName().startsWith("set")){
System.out.println(method.getName()+" start");
res = method.invoke(target, args);
proxy.invokeSuper(obj, args);
System.out.println(method.getName()+" end..");
}
if(method.getName().startsWith("get")){
System.out.println(method.getName()+" start");
res = method.invoke(target, args);
proxy.invokeSuper(obj, args);
System.out.println(method.getName()+" end");
}
return res;
}
}
// Делегат класс
package com.anz.interceptorproject;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import net.sf.cglib.proxy.MethodInterceptor;
import org.junit.Test;
public class SimpleUnitTest {
// this test is being used to test if when object is being intercepted will all its child object be intercepted automatically or not
@Test
public void TestifchildrenObjectIntercepted() {
String proxyStudentName="";
ClassFacadeCglib cglib=new ClassFacadeCglib();
Student studentMehak=new Student();
studentMehak.setAge(30);
studentMehak.setName("Mehak Anand");
Student studentComploexproxy=new Student();
studentComploexproxy.setAge(23);
studentComploexproxy.setName("proxystudent Complex");
//let us assume the Teacher object is an object return from JCR after the adapTo() function is called on a resource
Teacher teacher=new Teacher();
teacher.setComplexObjectStudent(studentComploexproxy);
teacher.getStudents().add(studentMehak);
teacher.setCource("Math");
teacher.setUserName("Mehak");
teacher.getUserName();
Teacher proxyTeacher=(Teacher)cglib.getInstance(teacher);
/proxyTeacher.getClass().getDeclaredMethods();
for (Student proxyStudentList:proxyTeacher.getStudents())
{
//the intercept method is not called.
proxyStudentName= proxyStudentList.getName();
}
Student testComplexStudent=teacher.getComplexObjectStudent();
assertEquals("Math",proxyTeacher.getCource());
//the intercept method is not called
testComplexStudent.getAge();
System.out.println( teacher.getUserName());
assertTrue(true);
}
}
Привет Алекс, спасибо .О что, если мы хотим сделать назначая отражения/усиление объекта во время выполнения, а не на constructor level.So, например, если мы обнаружили, что feild - это что-то отдельно от обычного первичного времени, такого как коллекция или любой другой объект класса, к которому он должен иметь привязанность. –