【问题标题】:Get (access) class from its field从其字段中获取(访问)类
【发布时间】:2014-09-16 15:09:09
【问题描述】:

对 Java 和 SO 来说都是新手。这是我的问题:

假设 x 是 X 类的一个实例。而 y 是 X 的一个属性(字段)。如果我在函数 f 中传递“x.y”,有没有办法访问 x?

例子:

Class Person
{
    public Girl girl; //Girl itself is another class
}

public void function1(Girl g)
{
     //body
}

Person p = new Person();
p.girl = new Girl();
function1(p.girl);

现在,我想在函数中访问 p。 (类似于链表中的“前一个”指针)。

环顾四周,发现了一种叫做反射的东西。但这并没有帮助,真的。谢谢!

【问题讨论】:

  • 你的代码是无效的java。没有不属于类的函数。函数可以通过引用 this 来引用其类的本地实例 - 这就是您从函数内部引用 Person 实例的方式(Java 中的方法,但 w/e)。
  • I want to access ... in the function 然后添加为参数。
  • 我刚刚输入了需要的内容。假设 function1 是正在发生所有处理的另一个类的一部分。而且 Person、Girl 和这个 Process 类是同一个包的一部分。
  • 为什么不直接改变接受 Person 的方法?
  • @bcsb1001,gnomed - 我不想那样做。我正在尝试输入一个通用函数,因为我有不同的类,比如 Person。但他们都有Girl作为属性。而且我正在尝试在不使用任何继承的情况下工作,因此无法将这些类创建为父类。

标签: java class reflection field


【解决方案1】:

您的问题的简短回答是否定的。除非 Girl 对象专门设计为引用其父对象(您在 java 的 GUI 对象中看到很多)。但这取决于设计课程的人。就像您的“先前指针”示例一样,该示例首先依赖于开发人员实现“先前指针”。开发人员可以很容易地使用没有先前指针的单链表。

简而言之。这取决于您使用的对象。反思不是这里的答案。反射更多的是通过字符串名称访问事物并检查类的成员。

【讨论】:

  • 如何创建这样的对象?这将涉及在 Girl 类中创建一个字段 Person 并将它们相互链接,对吗?
  • 正确。通常它被命名为“父”引用。尽管取决于您打算做什么,但这里略读了很多好的 Java 实践。 java中的字段应该很少是公共的,等等......你在使用IDE吗?如果没有,我建议您购买一个并查看警告。
  • 是的,没关系。这是一项应该让我们欣赏 OOP 的任务。 -_- 所以有很多限制。不过,谢谢。 :)
  • 啊,以后请将属于作业的堆栈溢出问题标记为“家庭作业”,您仍然会得到很好的答案,但人们会知道它是为了学习,并让您减少小细节的麻烦.
【解决方案2】:

如果参考可用,您当然可以参考,例如链接列表。看看这个程序。如果我误解了您的问题,请告诉我。

public class Person
{

    String personName;
    static class Girl 
    {
        Person girlParent;
        String girlName;

        public Girl(String name, Person parent)
        {
            girlName = name;
            girlParent = parent;
        }
    }

    public Person(String name)
    {
        personName = name;
    }

    public static void function(Girl girl)
    {
        System.out.println("The girl's name is "+girl.girlName);
        System.out.println("The girl's parent is "+girl.girlParent.personName);
    }

    public static void main(String[] args)
    {
        Person julia = new Person("Julia");
        Girl nancy = new Girl("Nancy", julia);
        function(nancy);
    }
}

输出是

The girl's name is Nancy
The girl's parent is Julia

【讨论】:

  • 好的,谢谢。我猜gnomed的答案是相似的。 :)
  • @Mallika,:) 没问题。如果我的回答对您有帮助,您至少可以将其标记为答案吗?
  • 我不建议向初学者展示内部静态类...我知道您这样做是为了将代码保存在同一个文件中,但这对于新手来说并不容易到语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2011-05-29
  • 2015-12-02
相关资源
最近更新 更多