从javabean中提取get和set方法。

Posted

tags:

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

在“任意”一个javabean中提取出其中所有的get和set方法,然后在另外的一个类中使用:
org.setId(row.getId());
org.setProtocol(row.getProtocol());
org.setHostIp(row.getHostIp());
org.setPort(row.getPort());
org.setBaseUrl(row.getBaseUrl());
org.setUser(row.getUser());
org.setPassword(row.getPassword());
org.setEncrypt(row.getEncrypt());



一个通用的方法,把任意的get和set变成如上的格式。
(对java理解有限,表达不是很好,请各位帮忙。)

你可以看下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);




参考技术A 你的意思是,随便给一个类名,然后能在其他类里调用它的get set方法么?
如果是的话请追问,不是的话请解释。我理解能力有限...追问

是的。刚接触java

追答

你说的其实就是反射

测试类:
class exp
private String str;

private int in;

public int getIn()
return in;


public void setIn(int in)
this.in = in;


public String getStr()
return str;


public void setStr(String str)
this.str = str;



main:
try
Class cls = Class.forName("exp");
Object obj = cls.newInstance();
List list = Arrays.asList(cls.getDeclaredMethods());
List name = new ArrayList();
//显示所有声明的方法
for (Method method : list)
System.out.println(method.getName());
name.add(method.getName());

//通过方法名调用方法 setIn
list.get(name.indexOf("setIn")).invoke(obj, 123);
//测试赋值
System.out.println(list.get(name.indexOf("getIn")).invoke(obj));

catch (InstantiationException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IllegalAccessException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IllegalArgumentException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (InvocationTargetException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (SecurityException e)
// TODO Auto-generated catch block
e.printStackTrace();


以上两个类你可以放在一个.java文件里

这里需要注意的是,因为是通过反射,你最好清楚你要调用方法的名称,如果不清楚你是无法调用的
另,若你需要反射的类在缺省包里,那么注意了,只有在缺省包里才能通过反射找到他。否则你只能给他一个包
以上是反射的一个实例,通过反射你可以映射出一个完整的类。反射极其重要,建议你系统的学习下,不难,但是很重要!

希望对你又帮助

PHP中__get()和__set()的用法实例详解

php面向对象_get(),_set()的用法 
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性。类似于java中的javabean的操作,使用的方法也类似,只是不需要像javabean中那样,对每个字段进行set和get的操作。只需要加上两个魔术方法即可。即私有成员的设值和取值的操作。在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加: 

复制代码代码如下:

//__set()方法用来设置私有属性 
public function __set($name,$value){ 
$this->$name = $value; 

//__get()方法用来获取私有属性 
public function __get($name){ 
return $this->$name; 


__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的,但是如果你在类里面加上了这个方法,在使用“echo$p1->name”这样的语句直接获取值的时候就会自动调用__get($name)方法,将属性name传给参数$name,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。

__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上 
了,如果没有__set()这个方法,是不允许的,比如:$this->name=‘zhangsan‘,这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name,把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下: 

复制代码代码如下:

<?php 
class Person 

//下面是人的成员属性,都是封装的私有成员 
private $name; //人的名子 
private $sex; //人的性别 
private $age; //人的年龄 
//__get()方法用来获取私有属性 
private function __get($property_name) 

echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; 
if(isset($this->$property_name)) 

return($this->$property_name); 

else 

return(NULL); 


//__set()方法用来设置私有属性 
private function __set($property_name, $value) 

echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; 
$this->$property_name = $value; 


$p1=newPerson(); 
//直接为私有属性赋值的操作,会自动调用__set()方法进行赋值 
$p1->name="张三"; 
$p1->sex="男"; 
$p1->age=20; 
//直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值 
echo "姓名:".$p1->name."<br>"; 
echo "性别:".$p1->sex."<br>"; 
echo "年龄:".$p1->age."<br>"; 
?> 


程序执行结果: 
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 
在直接获取私有属性值的时候,自动调用了这个__get()方法 
姓名:张三 
在直接获取私有属性值的时候,自动调用了这个__get()方法 
性别:男 
在直接获取私有属性值的时候,自动调用了这个__get()方法 
年龄:20 
以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。






























































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

javabean中set和get方法

JavaBean

JavaBean规范

JavaBean规范

BeanUtils.populate 的作用

[Java Web] JavaBean