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 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?