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 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型