2016-05-25 10 views
0

У меня есть класс Учитель, у которого есть две переменные, одна из них - это класс учеников, а другой - объект класса Студент. Я перехватываю класс Учителя согласно моему пониманию, все предметы, находящиеся в классе Учителя, должны иметь прикрепленный к нему перехватчик. так, например, мы вызываем метод 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); 
    } 

} 

ответ

0

мое понимание все объекты под классного должны иметь перехватчик прилагается к нему. так, например, один из них мы называем методом геттера на переменную Стьюдента, полученной из класса Учителя или из списка. Он должен вызывать метод перехвата

Это неверно. Метод перехватчиков привязан только к объекту, созданному с помощью функции enhancer.create(). Любой объект, созданный с помощью конструктора класса - например, ваши объекты-ученики - не улучшается и, следовательно, не содержит перехватчиков. Одним из возможных решений являются использование фабричного метода вместо общественного конструктора для создания расширенных объектов:

public class Student { 
    protected Student() { 
    } 

    public static Student getInstance() { 
     Enhancer e = new Enhancer(); 
     // set superclass, interceptors etc here.... 
     return (Student) e.create(); 
    } 
} 
+0

Привет Алекс, спасибо .О что, если мы хотим сделать назначая отражения/усиление объекта во время выполнения, а не на constructor level.So, например, если мы обнаружили, что feild - это что-то отдельно от обычного первичного времени, такого как коллекция или любой другой объект класса, к которому он должен иметь привязанность. –

 Смежные вопросы

  • Нет связанных вопросов^_^