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