美文网首页
使用Java反射获取单例对象

使用Java反射获取单例对象

作者: 鹅鹅鹅_ | 来源:发表于2019-01-21 00:56 被阅读0次

    在Java中,在拿到类对象的Class后,就可以通过Java的反射机制来创建类对象的实例对象了,主要分为以下几种方式:

    • Class.newInstance()
    • 调用类对象的构造方法

    但是,如果需要被反射的类是单例呢?若使以上两种方式,则每次都会重新构造一个不同的实例。
    此时我们可以利用Class.getDeclaredMethod直接获取单例获取方法,然后invoke就可以了。

    单例类

    package ewhine.models;
    
    import java.lang.reflect.Method;
    
    public class SingletonReflection {
    
        private SingletonReflection() {}
    
        public static SingletonReflection getInstance() {
            return SingletonHolder.instance;
        }
    
        private static class SingletonHolder {
            public static final SingletonReflection instance = getInstance();
            private static SingletonReflection getInstance() {
                return new SingletonReflection();
            }
        }
    
        public void say() {
            System.out.println("hello singleton");
        }
    }
    

    关键是如下代码

    Class c = Class.forName("ewhine.models.SingletonReflection");
    Method m = c.getDeclaredMethod("getInstance", null);
    SingletonReflection singletonReflection = (SingletonReflection) m.invoke(null, null);
    

    测试

    public static void main(String[] args) {
            try {
                Class c = Class.forName("ewhine.models.SingletonReflection");
                Method m = c.getDeclaredMethod("getInstance", null);
                SingletonReflection singletonReflection = (SingletonReflection) m.invoke(null, null);
                
                singletonReflection.say();
                ((SingletonReflection) c.newInstance()).say();
    
                System.out.println(m.invoke(null) == m.invoke(null, null));
                System.out.println(c.newInstance() == c.newInstance());
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    

    输出

    hello singleton
    hello singleton
    true
    false
    

    相关文章

      网友评论

          本文标题:使用Java反射获取单例对象

          本文链接:https://www.haomeiwen.com/subject/gdhqjqtx.html