首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:使用类型参数访问私有构造函数

Java:使用类型参数访问私有构造函数
EN

Stack Overflow用户
提问于 2011-04-12 10:23:14
回答 7查看 58.4K关注 0票数 80

这是this question about java private constructors的后续文章。

假设我有以下类:

代码语言:javascript
复制
class Foo<T>
{
    private T arg;
    private Foo(T t) {
        // private!
        this.arg = t;
    }   

    @Override
    public String toString() {
        return "My argument is: " + arg;
    }   
}

我如何使用反射构造一个new Foo("hello")

应答

以下是基于jtahlborn's answer的工作原理:

代码语言:javascript
复制
public class Example {
    public static void main(final String[] args) throws Exception {
        Constructor<Foo> constructor;
        constructor = Foo.class.getDeclaredConstructor(Object.class);
        constructor.setAccessible(true);
        Foo<String> foo = constructor.newInstance("arg1");
        System.out.println(foo);
    }   
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-04-12 10:41:57

您需要获取类,找到接受下限为T的单个参数的构造函数(在本例中为Object),强制该构造函数可访问(使用setAccessible方法),最后使用所需的参数调用它。

票数 31
EN

Stack Overflow用户

发布于 2011-04-12 11:11:39

确保在获取构造函数时使用getDeclaredConstructors,并将其可访问性设置为true,因为它是私有的。

像这样的东西应该行得通。

代码语言:javascript
复制
Constructor<Foo> constructor= (Constructor<Foo>) Foo.class.getDeclaredConstructors()[0];
constructor.setAccessible(true); 
Foo obj = constructor.newInstance("foo"); 
System.out.println(obj);

更新

如果要使用getDeclaredConstructor,请将Object.class作为参数传递,该参数将转换为泛型T。

代码语言:javascript
复制
Class fooClazz = Class.forName("path.to.package.Foo");
Constructor<Foo> constructor = fooClazz.getDeclaredConstructor(Object.class);
constructor.setAccessible(true); 
Foo obj = constructor.newInstance("foo"); 
System.out.println(obj);
票数 56
EN

Stack Overflow用户

发布于 2014-04-12 05:05:19

好吧,如果私有构造函数没有接受任何参数,那么我们在创建新实例时会遇到问题,在这种情况下,在setAccessible为true之后,我们不能创建对象。即使是construct.newInstance(null);也不会为无参数构造函数创建对象。

我们可以使用反射创建以下代码的对象吗:

代码语言:javascript
复制
public class Singleton {

    private static Singleton instance = new Singleton();

    /* private constructor */
    private Singleton() {}

    public static Singleton getDefaultInstance() {
        return instance;
    }
}

是的,我们可以创建上面类的对象。

代码语言:javascript
复制
// reflection concept to get constructor of a Singleton class.  
Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();

// change the accessibility of constructor for outside a class object creation.  
constructor.setAccessible(true);

// creates object of a class as constructor is accessible now.  
Singleton secondOb = constructor.newInstance();

// close the accessibility of a constructor.
constructor.setAccessible(false);

你可以参考我的博客:http://sanjaymadnani.wordpress.com/2014/04/14/singleton-design-pattern-in-java/的示例2:“急切初始化”和“反射单例违规”。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5629706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档