使用JavaBeans在类之间传递数据

使用JavaBeans在类之间传递数据,java,javabeans,Java,Javabeans,一条重要信息:这些类都是独立的文件,总共大约有10个bean。 我正在从事一个有多个类的项目,必须通过这些类传递数据。 例如,来自say Class1的两个字符串必须能够在Class2中使用 我的程序使用带有set和get方法的javabean,但是如果我在一个类中设置一个bean,并尝试在另一个类中获取该数据,我只会返回一个null值 我不确定最好的方法是什么,我已经很好地定义了bean,并希望继续使用它们,但我不知道如何使用它们 有人能给我指出正确的方向或举个例子吗。 谢谢 编辑 Bean类

一条重要信息:这些类都是独立的文件,总共大约有10个bean。

我正在从事一个有多个类的项目,必须通过这些类传递数据。 例如,来自say Class1的两个字符串必须能够在Class2中使用

我的程序使用带有set和get方法的javabean,但是如果我在一个类中设置一个bean,并尝试在另一个类中获取该数据,我只会返回一个null值

我不确定最好的方法是什么,我已经很好地定义了bean,并希望继续使用它们,但我不知道如何使用它们

有人能给我指出正确的方向或举个例子吗。 谢谢

编辑

Bean类代码片段

public class beans implements java.io.Serializable {



private String string1;


public String getstring1() {

    return this.string1;
}

public void setstring1(String string1) {
    this.string1 = string1;
}
和设置器代码,如class1:

beans bean = new beans();   
bean.setstring1("test");
下注的班级是第二班

beansbean=新bean();
String text=bean.getstring1()


这就是我使用bean的方式,它们没有按照我希望的方式工作。

如果您正在序列化/反序列化您的类,请确保

  • 字符串字段本身没有标记为瞬态

  • 您没有在忘记字符串字段的对象中使用自定义writeObject(ObjectOutputStream)方法

  • 您不能使用忘记字符串字段的自定义clone()方法克隆类

  • 您首先正确地编写了setter和getter


  • 事情应该会成功的;)

    你的问题让我很困惑。您指的是企业JavaBean吗

    如果你只是说普通的JavaBeans只具有get和set方法,那么我建议的第一件事就是学习如何使用。首先测试数据bean,以确保它按预期工作

    此外,如果您的类位于同一个JVA中(您只启动一个java.exe/运行一个应用程序),那么一切都应该正常工作

    public class Data { 
        private String value; 
        public void set(String value) { this.value = value; }
        public String get() { return this.value; }
    }
    
    public class ClassA {
        Data data = new Data();
        ClassA() { data.set("From ClassA"); }
    }
    
    public class ClassB {
        Data data;
        ClassB(Data data) { this.data = data; }
        public void print() {
          System.out.println(data.get());
        }
    }
    
    public static void main(String args []) {
        new ClassB(new ClassA().data).println();
    }
    
    这是一个使用数据对象传递信息的简单示例

    希望这是你想知道的

    [更新]

    添加一些代码后,我看到了问题所在。正如其他用户已经编写的那样,您每次都在创建新对象(实例)。因为string1是该类的一个属性,所以它的任何实例都有自己的值

    默认示例是一个人。创建具有属性名称的Person类(类似于string1)可以创建两个Person(类Person的实例)。现在,您可以为每个人单独命名

    这就是阶级的含义。指定该类的实例(实际对象)的属性(实例变量)和行为(方法)

    如果您想要共享信息,您需要一种将类的实例(对象)传递给其他实例的方法。在Java中,存在着不同的方式。您可以使用全局的静态变量(绑定到类而不是类的实例),您可以使用单例模式(使用静态变量),您可以使用ThreadLocal(仅限于当前线程的全局存储),您可以使用存储对象的管理器/存储库,您可以传递管理器/存储库对象,您可以使用数据库,也可以使用类似于透明对象管理器的依赖项注入器。基本上就是这样

    对于您的用例,我将首先使用Singleton

    public class MySingleton {
       private static Bean myBean;
       public static void setBean(Bean myBean) { MySingleton.myBean = myBean; }
       public static Bean getBean() { return myBean; }
    }
    
    使用该类很简单:

    Bean bean = new Bean();
    bean.setString1("test");
    MySingleton.setBean(bean);
    Bean bean2 = MySingleton.getBean();
    System.out.println(bean2.getString1()); //prints test
    

    但要注意,这是一种懒惰的做事方式。如果您有一个复杂的项目,尤其是在序列化、并发和重用方面,使用static会有一些缺点。

    在您的示例中,您在每个类中创建一个新bean。第一个类和第二个类引用了两个不同的对象,这就是为什么它们不能访问相同的值

    有多种方法可以解决这个问题,这取决于您的应用程序。但让我提出一个通用的解决方案

    您可以创建一个
    BeanRepository
    ,负责引用所有bean对象。然后,其他类需要知道bean的
    id
    ,它们可以获得一个引用

    BeanRepository(注意静态方法):

    A类和B类:

    public class ClassA {
        private Bean bean;
    
        public ClassA(int beanId) {
            this.bean = BeanRepository.getBean(beanId);
        }
    
        public void test() {
            System.out.println("I am ClassA. You are " + bean.whoAmI());
        }
    }
    
    public class ClassB {
        private Bean bean;
    
        public ClassB(int beanId) {
            this.bean = BeanRepository.getBean(beanId);
        }
    
        public void test() {
            System.out.println("I am ClassB. You are " + bean.whoAmI());
        }
    }
    
    试验方法:

    public class Main {
        public static void main(String[] args) {
            BeanRepository.putBean(1, new Bean("one"));
    
            ClassA a = new ClassA(1);
            ClassB b = new ClassB(1);
    
            a.test();
            b.test();
        }
    }
    

    顺便说一下,我的类是可序列化的,即公共类bean实现java.io.serializable{你能发布一个好的吗?我可以发布我的bean类的一个片段,以及它们的设置和获取位置,但我无法发布完整的代码,原因有很多。我正在尝试在类B中的公共静态空间中获取数据。如果我尝试使用你的第二个示例,使用三个classe文件Main、bean和MySingleton,并尝试运行包含这是您的最后一个代码片段,我得到以下错误:错误:(12,33)java:找不到符号符号:方法getBean()位置:类型为Bean的变量bean2错误:(10,20)java:非静态方法setBean(Bean)无法从静态contextExcellent引用,在Singleton类的第3行中只做了一个小修改,我将其更改为:public static void setBean(Bean myBean){MySingleton.myBean=myBean;}现在一切都很好。谢谢!!也更正了。很好的捕获。我也看不到你如何定义每个bean,比如在类中我想设置bean FirstName和LastName,在类B中的Main threat中我想打印它们以便在bean类中可以有多个bean?
    public class ClassA {
        private Bean bean;
    
        public ClassA(int beanId) {
            this.bean = BeanRepository.getBean(beanId);
        }
    
        public void test() {
            System.out.println("I am ClassA. You are " + bean.whoAmI());
        }
    }
    
    public class ClassB {
        private Bean bean;
    
        public ClassB(int beanId) {
            this.bean = BeanRepository.getBean(beanId);
        }
    
        public void test() {
            System.out.println("I am ClassB. You are " + bean.whoAmI());
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            BeanRepository.putBean(1, new Bean("one"));
    
            ClassA a = new ClassA(1);
            ClassB b = new ClassB(1);
    
            a.test();
            b.test();
        }
    }