能用反射获取单例对象,并且得到它当前的值吗?

此去正年少 2019-02-02 01:00:34
有这么一个单例类,位于项目A模块:

package com.test.manager;

public class MyManager {

private static MyManager instance;

private List<String> dataList = new ArrayList();

private MyManager {}

public static MyManager getManager {
if (instance == null) {
instance = new MyManager();
}
return instance;
}

public void doSomething() {
各种处理
}

public void putData(String s) {
对dataList的处理;
}

xxx其他对成员变量的操作方法等
}

现在我有个需求,要在项目B模块使用这个doSomething方法,但是AB两个模块不依赖,所以不能直接调用MyManager.getManager.doSomething()。

想用反射实现,目前已经尝试过这种方法:

try {  
            Class class1 = Class.forName("com.test.manager.MyManager");  
            Constructor[] constructors = class1.getDeclaredConstructors();  
            AccessibleObject.setAccessible(constructors, true);  
            for (Constructor con : constructors) {  
                if (con.isAccessible()) {  
                    Object classObject = con.newInstance();  
                    Method method = class1.getMethod("doSomething");  
                    method.invoke(classObject);  
                }  
            }  

        }  
        catch (Exception e) {  
            e.printStackTrace();  
        }
    }

但是这种方法拿到的并不是那个单例对象,而是创建了一个新对象,这个新对象的dataList是空的。

有没有可能通过反射的方式得到这个对象?要求是,得到的必须是这个单例对象,而且这个单例对象的dataList的值也是当前的值。
...全文
1144 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
此去正年少 2019-02-27
  • 打赏
  • 举报
回复
按楼上的大牛的指教,试了下最终这样也就可以了:

	try {  
            Class class1 = Class.forName("com.test.manager.MyManager");  
            Method method = class1.getMethod("getManager");  

            Object instance = method.invoke(new Object());
            Method method1 = class1.getMethod("doSomething");  
            method1.invoke(instance);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }
此去正年少 2019-02-27
  • 打赏
  • 举报
回复
引用 6 楼 qybao 的回复:
你没弄清楚invoke的参数的意义,invoke就是你要调用的目标方法的参数, 你的getManager方法本身无参数,所以不需要objectClass 你可以Object instance = method.invoke(new Object[]{}); //空参数
多谢啦
qybao 2019-02-25
  • 打赏
  • 举报
回复
你没弄清楚invoke的参数的意义,invoke就是你要调用的目标方法的参数,
你的getManager方法本身无参数,所以不需要objectClass
你可以Object instance = method.invoke(new Object[]{}); //空参数
此去正年少 2019-02-22
  • 打赏
  • 举报
回复
引用 4 楼 qybao 的回复:
需要取构造器吗?
反射取得getManager调用就可以返回实例,这本身就是public方法
以下代码应该就可以了
Method method = class1.getMethod("getManager");
Object instance = method.invoke(classObject);
Method method1 = class1.getMethod("doSomething");
method1.invoke(instance);

构造方法是私有的……这么写的话,classObject从哪里来呢?
qybao 2019-02-05
  • 打赏
  • 举报
回复
需要取构造器吗?
反射取得getManager调用就可以返回实例,这本身就是public方法
以下代码应该就可以了
Method method = class1.getMethod("getManager");
Object instance = method.invoke(classObject);
Method method1 = class1.getMethod("doSomething");
method1.invoke(instance);
此去正年少 2019-02-02
  • 打赏
  • 举报
回复
try {
Class class1 = Class.forName("com.test.manager.MyManager");
Constructor[] constructors = class1.getDeclaredConstructors();
AccessibleObject.setAccessible(constructors, true);
for (Constructor con : constructors) {
if (con.isAccessible()) {
Object classObject = con.newInstance();
Method method = class1.getMethod("getManager");

Object instance = method.invoke(classObject);
Method method1 = class1.getMethod("doSomething");
method1.invoke(instance);
}
}

}
catch (Exception e) {
e.printStackTrace();
}
}
此去正年少 2019-02-02
  • 打赏
  • 举报
回复
哦 解决了。

引用 1 楼 maradona1984 的回复:
你都写到这份上了,难道就不知道去百度下如何反射调用一个静态方法?或者直接反射拿到MyManager这个静态变量?
maradona1984 2019-02-02
  • 打赏
  • 举报
回复
你都写到这份上了,难道就不知道去百度下如何反射调用一个静态方法?或者直接反射拿到MyManager这个静态变量?

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧