Trong Java, làm thế nào để bạn nhận được đối tượng lớp gốc và/hoặc tên lớp của proxy Java EE (CDI)?Tên lớp gốc của proxy (không có thao tác chuỗi thủ công)
Khi sử dụng getName()
về một trường hợp proxy, tên trở lại là một cái gì đó giống như
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
Có một số functionaliy trong Java SE (7) hoặc EE (6) mà sẽ trở lại trong hai bản gốc, ví dụ lớp unproxied hoặc tên của nó?
tôi cần:
com.company.employeemgmt.EmployeeManager
Tất nhiên, tôi chỉ đơn giản là có thể sử dụng chuỗi thao tác, nhưng tôi muốn biết nếu chức năng như vậy đã là Java- (EE) -inbuilt.
Tôi đã tìm thấy java.reflect.Proxy
, mà tôi có thể sử dụng để phát hiện proxy:
public static void doSomething(Class<? implements Serializable> managerClass)
{
if (Proxy.isProxyClass(managerClass))
{
// unproxy how?
managerClass = managerClass.getUnproxiedClass();
}
// delegate
doSomething(managerClass.getName());
}
public static void doSomething(String prefix)
{
// do real work
...
}
..., nhưng làm thế nào sẽ bạn dereference lớp ban đầu?
Cập nhật:
Bí quyết sẽ được truy cập MyUtil.doSomething(EmployeeManager.class)
(hoặc MyUtil.doSomething(EmployeeManager.class.getName())
), nhưng tôi muốn sử dụng/vượt qua MyUtil.doSomething(this.getClass())
(hoặc MyUtil.doSomething(this.getClass().getName())
) từ tất cả các khách hàng như mã này có thể được sao chép xung quanh mà không thay đổi thủ công .
Bạn đã thử managerClass.getDeclaringClass() hoặc managerClass.getEnclosingClass()? – jdb
Cả hai đều trả về giá trị rỗng. – Kawu
Không có gì bạn làm ở đây sẽ là di động hoặc ổn định. Proxy thực sự chỉ là "liên quan đến" lớp khác.CDI không quy định công nghệ nào được sử dụng để proxy hoặc bất kỳ cách nào để lấy từ proxy đến chi tiết Class của Managed Bean (mặc dù bạn có thể bắt đầu với BeanManager API và chuyển tiếp thay vì ngược lại từ một đối tượng) – covener