利用arthas 调用任意bean中的方法

本文介绍如何利用Arthas和Ognl在Dubbo框架下获取SpringContext中的Bean,并演示了通过特定语法调用Bean的方法,包括简单类型返回值和复杂对象参数的处理。
部署运行你感兴趣的模型镜像
从spring context里获取任意bean

步骤1 获取所有加载com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory的classLoaderHash

sc -d com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory



class-info com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory

code-source /home/software/tomcat_8080/webapps/market-base-sensor-impl-1.4.0-SNAPSHOT/WEB-INF/lib/dubbo-2.6.0.jar

name com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory

isInterface false

isAnnotation false

isEnum false

isAnonymousClass false

isArray false

isLocalClass false

isMemberClass false

isPrimitive false

isSynthetic false

simple-name SpringExtensionFactory

modifier public

annotation

interfaces com.alibaba.dubbo.common.extension.ExtensionFactory

super-class +-java.lang.Object

class-loader +-ParallelWebappClassLoader

context: market-base-sensor-impl-1.4.0-SNAPSHOT

delegate: false

----------> Parent Classloader:

java.net.URLClassLoader@6f1fba17

+-java.net.URLClassLoader@6f1fba17

+-sun.misc.Launcher$AppClassLoader@18b4aac2

+-sun.misc.Launcher$ExtClassLoader@41fecb8b

classLoaderHash 2e0d01ab



步骤2

使用ognl调用bean

//@Autowired

//private RedisTemplate redisTemplate;

[arthas@30418]$ ognl -c 2e0d01ab '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("interruptMonitorServiceImpl").redisTemplate.opsForValue().get("stylelogexportdatadelete")'

@Integer[1]

//BaseDTO<String> add(BaseQUERY<InterruptMonitor> interruptMonitor);

[arthas@30418]$ ognl -c 2e0d01ab '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("interruptMonitorServiceImpl").add(null)'

@BaseDTO[

serialVersionUID=@Long[5602191025869544377],

responseCode=@String[E11_ARG_IS_EMPTY],

responseMsg=@String[arg is empty:{placeholder}],

requestId=null,

timestamp=@String[1587347158026],

dataKey=null,

data=null,

]

当方法是复杂对象不是简单的字符串

[arthas@30418]$ ognl -c 2e0d01ab '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next,#data=new com.hanshow.wise.base.sensor.model.sensor.InterruptMonitor(), #query=new com.hanshow.wise.common.jo.BaseQUERY(),#query.setData(#data),#query.setRequestId("1"), #data.setMerchantId("2156001"),#data.setStoreCode("HS001"),#context.getBean("interruptMonitorServiceImpl").add(#query)'
实际参数{
    "data":{
        "storeCode":"HS001"
    },
    "merchantId":"2156001",
    "requestId":"1"
}
@BaseDTO[

serialVersionUID=@Long[5602191025869544377],

responseCode=@String[SUC],

responseMsg=@String[success],

requestId=@String[1],

timestamp=@String[1587370520281],

dataKey=null,

data=null,

]

 

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

在使用 Arthas 查看特定 Bean 字段值时,可以通过 OGNL 表达式结合 Spring 上下文获取 Bean 实例,并进一步访问其字段值。这种方法适用于运行中的 Spring 应用程序,尤其是在调试或性能调优场景中非常实用。 假设需要查看名为 `insurancePolicyUseCountController` 的 Bean 中的字段 `detailSize`,可以使用如下命令: ```bash ognl '@com.xxx.itc.quartz.utils.SpringApplicationContextHolder@getSpringBean("insurancePolicyUseCountController").detailSize' ``` 此命令通过 `SpringApplicationContextHolder` 获取 Spring 容器中的 Bean,然后访问其字段值。为了确保这种方式能够正常工作,需要保证 `SpringApplicationContextHolder` 类已经正确实现 `ApplicationContextAware` 接口,并且在 Spring 启动完成后能够成功获取到上下文信息[^2]。 此外,如果 Bean 的字段是私有变量且没有提供公开的 Getter 方法,直接访问可能会受限。此时可以考虑通过反射机制或者修改字段访问权限来获取值,但需要注意这可能带来的安全性和稳定性风险。 ### 示例代码:实现 `SpringApplicationContextHolder` 以下是一个简单的 `SpringApplicationContextHolder` 实现,用于在 Spring 启动后获取 Bean: ```java import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { context = applicationContext; } public static <T> T getBean(Class<T> beanClass) { return context.getBean(beanClass); } public static Object getSpringBean(String beanName) { return context.getBean(beanName); } } ``` 通过上述实现,可以在 Arthas 中方便地调用 `getSpringBean` 方法获取 Bean 并访问其字段值。 ### 总结 - 使用 OGNL 表达式结合 `SpringApplicationContextHolder` 可以有效获取 Bean 的字段值。 - 确保 `SpringApplicationContextHolder` 正确实现并能够在 Spring 容器中注册。 - 对于私有字段,可能需要通过反射或其他方式访问,但需谨慎处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值