javabean中set和get方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javabean中set和get方法相关的知识,希望对你有一定的参考价值。

class Bean

int a;
public int getA()

return a;

public void setA(int a)

this.a = a


一直很奇怪为什么要用set和get,直接访问a不就可以了?有些书上说,隐藏了类的内部细节,避免用户修改,可是我还不是照样可以用set方法修改?

请指教,麻烦说的详细一点,谢谢各位了,这个问题让我一直很苦恼啊~
刚才没说清楚,补充一下,我的意思就是说如果像这样一个javabean:
public class Test
private int add(int a,int b)
return a+b;


我在jsp页面或者别的类中直接调用add(3,5)不就可以了么?那怎么用set和get实现这种方法的隐藏? 那smile_bug你说什么时候可以用到set和get?我感觉好像我做了很多项目了,都没用到过阿....

首先新建一个javabean Student.java,字段有sno,sname,age等。如下:
public class Student

private String sno;
private String sname;
private int age;

保存后,右键Student.java,选择source->Generate Setter and Getter...这一项,选择select All选中所有的字段,确定后,即生成了所有字段的get和set方法
参考技术A 除了共有属性,一般用private需要使用时用get.赋值用set
这样可以把属性隐藏起来。
这样调用SET方法之前比方说可以加个判断。是不是空值之类的。你也可以让你不想别人修改的属性不提供get和set方法!
这样别人可以修改使用哪个属性不可以修改使用哪个属性都在你的控制之内。

你要什么,就给我讲,我到屋里给你拿出来,但是你却不可以直接进屋去拿,万一你不熟悉我家里的情况,把我家搞乱了咋个办啊。(很精典)

另外。在hibernate中给一个属性赋值。hibernate查找的就是set+属性名(第一个字母大字)这样一个方法。然后自动把你要赋的值给它!

尽量让属性(物件,东西)私有化,让方法(能力,功能)公有化!
set/get是说属性的!对属性提供set/get方法!
参考技术B 一方面是隐藏程序细节 一方面是javabean的规范要求

一个例子
class Person
private String name;
private String age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getAge()
return age;
public void setAge(String age)
this.age = age;
在这里本来就可以用get与set取值或者设置值了,假如我们直接将变量声明为public不是更简单点。这种情况有必要用get与set方法吗?

在这里解释为什么要还是要用get与set。

这里就有一个封装和控制的问题。假设你直接访问属性 person.name;突然有一天,你可能需要对每个名字,或者某个名字过滤掉一些东西,怎么办?那么你就只好在出现person.name的地方到处添加过滤机制。如果你使用getName()方法,那么我就在这个方法里面过滤一下就OK了。 其实总体思想就是一个面向对象的观点来做事情,你要什么,就给我讲,我到屋里给你拿出来,但是你却不可以直接进屋去拿,万一你不熟悉我家里的情况,把我家搞乱了咋个办啊。
参考技术C 你可以看到set/get针对的是变量如你上面那个a
和你后面那个add方法没有关系,也不能通过set/get来隐藏。

而之所以用Set/get方法,这是面向对象里面的封装本回答被提问者采纳
参考技术D 你可以看下java反射机制,可以解决你的问题。
简单写了下:

import java.lang.reflect.Method;

public class Demo
private String id;

public String getId()
return id;


public void setId(String id)
this.id = id;


/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
Demo demo = new Demo();
Method[] methods = Demo.class.getMethods();// 类的方法
for (Method method : methods)
String methodName = method.getName();
// System.out.println("方法名:" + methodName);
if (methodName.startsWith("set")) // 如果方法名以set开头
method.invoke(demo, "测试值");// 调用方法


for (Method method : methods)
String methodName = method.getName();
// System.out.println("方法名:" + methodName);
if (methodName.startsWith("get") && !methodName.equals("getClass")) // 如果方法名以get开头
Object value = method.invoke(demo);// 调用方法,并打印返回值
System.out.println(value);




JavaBean规范

  JavaBean必须要为成员提供get/set方法,只提供其中的一个也是可以的,必须要有一个无参构造器,一般对于具有get或这个set方法的成员我们称之为属性,就算一个属性,没有对应的成员变量只有get/set方法,也是可以的。只有get方法的属性我们称为只读属性,属性的名称是get/set方法去除get/set之后,再将首字母变小写之后的名称,由set/get方法的名称来决定属性名称,而不是成员变量名,但是一般都是一致的。boolean类型的属性的get方法可以是is或者get开头。

package yu.bean;

/**
 * @Auther yusiming
 * @Date 2018/10/12 20:30
 */
public class Person {
    private String name;
    private int age;
    private String gender;

    // 必须提供无参构造器
    public Person() {
    }

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // 这个方法没有对应的成员,但是id也是一个属性
    public int getId() {
        return 11;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

 

内省

  内省就是通过反射来操作javaBean,但是内省使用起来更加方便一点,因为它掩盖了反射的操作,内省的过程,Introspector这个类叫做内省类

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        try {
            // BeanInfo是一个javaBean类型的信息类
            BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
            // 通过BeanInfo可以得到所有的属性描述符对象,
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            Method readMethod = propertyDescriptors[0].getReadMethod();
            Method writeMethod = propertyDescriptors[0].getWriteMethod();
            writeMethod.invoke(person, 11);
            System.out.println(person.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  但是这样操作bean还是太麻烦了,我们可以使用Apache提供的工具,commons-beanutils来完成对bean的操作,commons-beanutils对内省进行了进一步的封装,使得对bean的操作更加方便,要使用commons-beanutils首先要导入JAR包:

  • commons-beanutils.jar
  • commons-logging.jar 

  这两jar包之间有依赖关系,

  使用BeanUtils设置属性和获取属性

public class Test {
    public static void main(String[] args) throws Exception {
        String className = "yu.bean.Person";
        Class<?> clazz = Class.forName(className);
        Object bean = clazz.getDeclaredConstructor().newInstance();
        // 设置属性
        BeanUtils.setProperty(bean, "name", "张三");
        BeanUtils.setProperty(bean, "age", 20);
        BeanUtils.setProperty(bean, "gender", "男");
        // Person{name=‘张三‘, age=20, gender=‘男‘}
        System.out.println(bean.toString());
        // 获取属性
        String age = BeanUtils.getProperty(bean, "age");
        // 20
        System.out.println(age);
    }
}

  使用BeanUtils将map中的数据封装到bean中,注意map中的键必须要与bean的属性名一致,才能够封装进去

public class Test {
    public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put("username", "张三");
        map.put("password", "123");
        User user = new User();
        BeanUtils.populate(user, map);
        // User{username=‘张三‘, password=‘123‘}
        System.out.println(user.toString());
    }
}

  我们可以对BeanUtils再次封装

public static <T> T toBean(Map map, Class<T> clazz) {
    try {
        T bean = clazz.getDeclaredConstructor().newInstance();
        BeanUtils.populate(bean, map);
        return bean;
     } catch (Exception e) {
         throw new RuntimeException(e);
     }
}

   封装之后再次封装map中的数据到bean中,

public class Test {
    public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put("username", "张三");
        map.put("password", "123");
        User user = CommonUtils.toBean(map, User.class);
        // User{username=‘张三‘, password=‘123‘}
        System.out.println(user.toString());
    }
}

  

 

JSP中与JavaBean相关的标签

  • <jsp:useBean>:创建或者查找bean,可以指定在哪一个域中创建或者查找bean  
  • <jsp:setProperty>:给bean设置属性
  • <jsp:getProperty>:获取bean的属性

  使用方法:

<%--创建或者查找bean,不能重复出现--%>
<jsp:useBean id="user" class="yu.bean.User" scope="request"/>
<jsp:setProperty name="user" property="username" value="张三"/>
<jsp:setProperty name="user" property="password" value="123"/>
<jsp:getProperty name="user" property="username"/>
<jsp:getProperty name="user" property="password"/>

  

 

以上是关于javabean中set和get方法的主要内容,如果未能解决你的问题,请参考以下文章

JavaBean

JavaBean规范

JavaBean规范

[Java Web] JavaBean

什么是JavaBean

JavaWeb-JavaBean