Java 如何确定类是否是spring代理?
简而言之 在Java 如何确定类是否是spring代理?,java,spring,kotlin,reflection,spring-aop,Java,Spring,Kotlin,Reflection,Spring Aop,简而言之 在AopUtils中,我们有 /** * Check whether the given object is a JDK dynamic proxy or a CGLIB proxy. * <p>This method additionally checks if the given object is an instance * of {@link SpringProxy}. * @param object the obje
AopUtils
中,我们有
/**
* Check whether the given object is a JDK dynamic proxy or a CGLIB proxy.
* <p>This method additionally checks if the given object is an instance
* of {@link SpringProxy}.
* @param object the object to check
* @see #isJdkDynamicProxy
* @see #isCglibProxy
*/
public static boolean isAopProxy(@Nullable Object object) {
return (object instanceof SpringProxy && (Proxy.isProxyClass(object.getClass()) ||
object.getClass().getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)));
}
但这不会检测代理,因为即使对于明显代理的类,SpringProxy::class.java.isAssignableFrom(候选者)
也是false
我该怎么做
全图
我在BeanFactoryPostProcessor
中,我需要未代理的bean类通过反射来访问某些带注释的方法
访问发生在lambda函数中,该函数将首先使用ApplicationContext
检索类的bean。不能在此BeanFactoryPostProcessor
中强制实例化bean(事实上,如果是这样,则应该抛出异常,因为某些bean是会话范围的)
有趣的问题。为什么
类
对象是Spring代理?你是说Spring可以代理类实例吗?例如,我想您必须检查它们是否用@Component
注释。或者连接到Spring内部来检测它将扫描哪些类。你的意思是这样的@卡亚曼让我再试一次。。。我想知道Spring是否会在不创建bean来检查组件的情况下代理组件,而只是使用类对象。您链接到的问题需要一个实例化的bean。类
永远不会实例化或分配给任何“有用”的对象。只有来自它的bean(或带有例如.newInstance()
)的非bean)才会响应这些请求。所以你基本上只能访问元数据。@Kayaman你确定吗?因为我对你的评论想得更多了,我觉得这听起来不对<代码>类::isAssignableFrom检查,引用“如果此类对象表示的类或接口与指定类参数表示的类或接口相同,或者是其超类或超接口”。因此,如果AopUtils检查SpringProxy的对象实例,那么它的类应该满足这个检查,不是吗?请注意,为了证明我的陈述,我刚刚用一些解释性的示例代码更新了答案。
private fun <T> isAopProxyClass(candidate: Class<T>): Boolean {
return SpringProxy::class.java.isAssignableFrom(candidate)
&& (
Proxy.isProxyClass(candidate)
|| candidate.name.contains(CGLIB_CLASS_SEPARATOR)
)
}