handsome_761121 2012-03-27 19:07
浏览 665
已采纳

用java的反射机制,能不能调用到单例模式类中的方法(非静态)?

1.HelloWorld 类:
public class HelloWorld {
private static HelloWorld instance = null;
private HelloWorld() {
}
public static HelloWorld getInstance() {
if (instance == null) {
instance = new HelloWorld();
}
return instance;
}
public void sayHello() {
System.out.println("hello world!!");
}

public static void sayHello2() {
    System.out.println("hello world 222 !!");
}

}

2.测试类:
public class Test {
public static void main(String[] args) throws Exception {
try {
Class class1 = Class.forName("com.james.HelloWorld");
Object classObject = class1.newInstance();
Method method = class1.getMethod("sayHello");
method.invoke(classObject);
} catch (Exception e) {
e.printStackTrace();
}
}
}

3.运行结果报错:
java.lang.IllegalAccessException: Class com.james.Test can not access a member of class com.james.HelloWorld with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.Class.newInstance0(Class.java:349)
at java.lang.Class.newInstance(Class.java:308)
at com.james.Test.main(Test.java:43)

最后问题来了:这样"Object classObject = class1.newInstance();" new 一个实例肯定会出错的.现在有没有方法,通过这种反射的机制调用到"sayHello()"方法,大家帮我出出主意,先谢谢大家了.

  • 写回答

1条回答 默认 最新

  • Aronlulu 2012-03-27 20:24
    关注

    可以:
    [code="java"]
    public final class HelloWorld
    {
    private static HelloWorld instance = null;

    private HelloWorld()
    {
    }
    
    public static HelloWorld getInstance()
    {
        if (instance == null)
        {
            instance = new HelloWorld();
        }
        return instance;
    }
    
    public void sayHello()
    {
        System.out.println("hello world!!");
    }
    
    public static void sayHello2()
    {
        System.out.println("hello world 222 !!");
    }
    
    static class Test
    {
        public static void main(String[] args) throws Exception
        {
            try
            {
                Class class1 = Class.forName("HelloWorld");
                Constructor[] constructors = class1.getDeclaredConstructors();
                AccessibleObject.setAccessible(constructors, true);
                for (Constructor con : constructors)
                {
                    if (con.isAccessible())
                    {
                        Object classObject = con.newInstance();
                        Method method = class1.getMethod("sayHello");
                        method.invoke(classObject);
                    }
                }
    
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    

    }
    [/code]
    effective java中第三条就说了这种方式。还强调枚举才是单例的王道。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料