Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中访问非静态私有字段?_Java_Private_Non Static - Fatal编程技术网

如何在java中访问非静态私有字段?

如何在java中访问非静态私有字段?,java,private,non-static,Java,Private,Non Static,我在一个包中有一个非静态的私有字段,我想从另一个包中访问它,但我不知道怎么做。我搜索了一下,但没有找到任何有用的东西,而且这个网站上的其他问题也不是我的问题。你唯一能做到这一点的方法就是通过反思。但这是一个黑客。你真的应该找到另一种解决办法 如果您需要这样做,那么它表明另一个包的结构设计糟糕。如果您试图操纵的类是您自己的类,那么您应该考虑更改该代码 如果您确实需要这样做,并且无法更改其他类,则可以使用以下方法: Field f = BadClass.class.getDeclaredField(

我在一个包中有一个非静态的私有字段,我想从另一个包中访问它,但我不知道怎么做。我搜索了一下,但没有找到任何有用的东西,而且这个网站上的其他问题也不是我的问题。

你唯一能做到这一点的方法就是通过反思。但这是一个黑客。你真的应该找到另一种解决办法

如果您需要这样做,那么它表明另一个包的结构设计糟糕。如果您试图操纵的类是您自己的类,那么您应该考虑更改该代码

如果您确实需要这样做,并且无法更改其他类,则可以使用以下方法:

Field f = BadClass.class.getDeclaredField("privateField");
f.setAccessible(true);
f.set(badClassInstance, newValue);

也许最好的起点是关于反射的教程,以及
setAccessible
方法。

唯一可以做到这一点的方法是通过反射。但这是一个黑客。你真的应该找到另一种解决办法

如果您需要这样做,那么它表明另一个包的结构设计糟糕。如果您试图操纵的类是您自己的类,那么您应该考虑更改该代码

如果您确实需要这样做,并且无法更改其他类,则可以使用以下方法:

Field f = BadClass.class.getDeclaredField("privateField");
f.setAccessible(true);
f.set(badClassInstance, newValue);

也许最好的起点是关于反射的教程,以及
setAccessible
方法。

为私有字段创建getter和setter方法

例如:

public void setName ( String name )
{
      this.name = name;
}

public String getName ()
{
     return this.name;
}

为私有字段创建getter和setter方法

例如:

public void setName ( String name )
{
      this.name = name;
}

public String getName ()
{
     return this.name;
}

您应该导入该非静态私有字段所在的包。
如果您想从另一个包中的子类访问此字段,可以将“private”修饰符更改为“protected”,这将允许同一项目中的所有包通过继承访问此字段。

您应该导入该非静态私有字段所在的包。
如果要从不同包中的子类访问此字段,可以将“private”修饰符更改为“protected”,这将允许同一项目中的所有包通过继承访问此字段。

private
意味着只有声明此字段的类才能使用它。如果要访问它,需要定义一个公共getter。或者使用反射
private
意味着只有声明字段的类才能使用它。如果要访问它,需要定义一个公共getter。或者使用反射。有关实现的更多信息,请您简要介绍一下我如何通过反射来实现,我将尽快完成这项工作,因为我没有足够的时间来研究某些内容。请您解释一下f.set方法中的badClassInstance和newValue是什么@chiastic Security有关实现的更多信息-您能简要介绍一下我如何通过反射来实现这一点吗?我将尽快完成这项工作,但没有足够的时间来研究某些内容。请您解释一下f.set方法中的badClassInstance和newValue是什么@交叉安全性我想在另一个类中使用组合框值。我制作了一个如下的getter:public String getName(){Object selectedItem=cmbProductType.getSelectedItem();String selectedItemStr=selectedItem.toString();return selectedItemStr;}但是当我以这种方式在代码中使用字段时:String str=MainView.getName();它说“不能从静态上下文引用非静态方法getName()。@Bootimar该信息改变了问题。我强烈建议将其添加到问题中,代码格式正确。同时,它是否与()我想在另一个类中使用combobox值。我制作了如下getter:public String getName(){Object selectedItem=cmbProductType.getSelectedItem();String selectedItemStr=selectedItem.toString();return selectedItemStr;}但是当我在代码中以这种方式使用字段时:String str=MainView.getName();它说“不能从静态上下文引用非静态方法getName()。@Bootimar该信息改变了问题。我强烈建议将其添加到问题中,代码格式正确。同时,它是否与()