java:从另一个类获取私有变量,而不设置getter

时间:2016-03-24 15:26:26

标签: java getter private-members

我不允许改变A类,但我需要获得'a'的值(在构造函数中设置)。谁能告诉我怎么做?其他所有解决方案似乎都在A级提出一个吸气剂。我不允许以任何方式对A类进行更改,不允许更改为公共等。魔术必须在B类中发生。

public class A{
    private int a;
    public A(int x){
        a = x * 10;
    }
}

public class B{
    public B(int x){
        A instA = new A(x);
    }

    public int geta(){
        ???
    } 
}

PS:发表这个问题,因为每个类似的问题都是通过改变A类来回答的,而我不允许这样做。但由于似乎只有反思,这个问题可以被关闭。谢谢你们和男孩们。

3 个答案:

答案 0 :(得分:2)

这是私人字段的重点;它们不在封闭类的范围之外。

您有以下选择:

  1. 更改该类以提供吸气剂
  2. 改变你的整体设计,要么不需要那个价值;或者找到另一种方法让它可用于两个班级
  3. 不推荐:使用反射及其覆盖"私有"运行时保护

答案 1 :(得分:0)

最好的决定是获得一个吸气剂。在编写最佳实践时,这是最安全,最干净的解决方案。

使用反射可以实现您想要的效果 - 您可以按名称查找字段(如果名称在类的未来版本中发生更改,该怎么办?)并提取它的值如下:

A a = new A(5);
Field field = A.getField("a");
field.setAccessible(true);
int value = field.get(a);

但请记住,这被认为是超级hacky,它强烈建议反对。

答案 2 :(得分:0)

以下是如何做到这一点

<VirtualHost *:443>
        ServerName somedomain.com
        ServerAlias www.somedomain.com

        <Directory /mnt/myapp/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Require all granted
        </Directory>

        <Directory /mnt/myapp/current/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Require all granted
        </Directory>

        # Django Application
        Alias /static /mnt/myapp/current/static
        <Directory /mnt/myapp/current/static>
                Options FollowSymLinks
                Require all granted
        </Directory>

        <Directory /mnt/myapp/current/myproject/apache>
                <Files wsgi.py>
                        Options FollowSymLinks
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess grapevine python-path=/mnt/myapp/current:/mnt/env/lib/python3.4/site-packages
        WSGIProcessGroup myproject
        WSGIScriptAlias / /mnt/myapp/current/myproject/apache/wsgi.py

        SSLEngine on
        SSLCertificateFile /home/myapp/myapp.com.crt
        SSLCertificateKeyFile /home/myapp/myapp.com.key
        SSLCertificateChainFile /home/myapp/myapp.crt

</VirtualHost>