用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()"方法,大家帮我出出主意,先谢谢大家了.

解决方案

可以: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(); } } }}effective java中第三条就说了这种方式。还强调枚举才是单例的王道。

时间: 2024-11-16 05:44:51

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

action 没有跳转-Action中调用另一个类中的方法时没有跳转,但是新建的其他测试类就可以跳转,WHY?

问题描述 Action中调用另一个类中的方法时没有跳转,但是新建的其他测试类就可以跳转,WHY? action中调用EmailUtil中的sendHtmlMail方法: public void forgetPassword() throws Exception { String email = request.getParameter("email"); User u=userService.getByEmail(email); Json json=new Json(); if (St

利用java反射机制实现自动调用类的简单方法_java

1. 新建TestServlet类 package com.yanek.test; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.ht

Java的反射机制---动态调用对象的简单方法_java

唉!我还真是在面试中学习新东东啊,一个公司刚刚给了个测试,不过我很奇怪的是为什么web developer的职位居然考java的反射机制题,不过学习研究一下反射机制对我来说是件好事啦! 先说说什么是java反射机制吧,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这 种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对 象:在运行时判断任意一个

简单总结Java的反射机制的运用_java

Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 简单来说,一个类或者一个对象是拥有下面几种属性的: Method,Constructor,Field,其大致结构类图如下: 我们现在用代码来说明问题: 首先,我们看Class类,在Class类中,我们可以看见下面的几个重要的方法: getInterfaces() getSuperClass(); isInterface(); 这是用来得到一个类的接口或者超类,以及判断这个类是不是一个接口:

java的反射机制的问题

问题描述 java的反射机制的问题 111111111111111111111111111111111111111111111 解决方案 反射机制,好像是这样子,在public类里我创建了一个接口,可惜,我都不知道我什么时候用它,所以我就不初始化它了,突然有一天,我要初始化他一次,于是我就用反射机制来给它初始化一下.不知道对不对? 解决方案二: java反射机制及性能优化问题Java进阶(六)Java反射机制可恶问题NoSuchFieldExceptionJAVA中的反射机制 解决方案三: 这个

Java通过反射机制动态设置对象属性值的方法_java

/** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

内部类-Java编程中A类如何调用B类中M方法里的C类的实例?

问题描述 Java编程中A类如何调用B类中M方法里的C类的实例? import java.awt.*; import java.awt.event.*; public class TestListener{ public static void main(String[] args){ Counter c1 = new Counter("Hello"); c1.CreatButton(); c1.add(c1.button); ----------------------------(

怎么实现javascript中调用java类中的方法

问题描述 body中部分代码如:<center><font size="4" color="red">吊灯</font> <input type="button" id="diaodeng" value=<%=state[0]%> onclick="dianji1()"><br><br><br><br>

javascript-js类中一个方法无法调用弄一个方法

问题描述 js类中一个方法无法调用弄一个方法 <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> function ui(){ this.we=function(){ alert("wed"); } this.test=function(e