黑马程序员技术交流社区
标题:
自己做的一道题,反射的,花了很久,求高人看看问题如何
[打印本页]
作者:
碎流
时间:
2014-12-27 01:32
标题:
自己做的一道题,反射的,花了很久,求高人看看问题如何
代码可运行,但是不知道中间过程会不会有不到地方.
存在一个JavaBean,它包含以下几种可能的属性:
1:boolean/Boolean
2:int/Integer
3:String
4:double/Double
属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:
String类型的默认值为字符串 www.itheima.com
int/Integer类型的默认值为100
boolean/Boolean类型的默认值为true
double/Double的默认值为0.01D.
只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现
思路:
1.首先设置好javaBean类.取名为MyJavaBean
2.在类中设置好get,set方法.
3.属性名未知,我可以通过反射获取到所有的字段,把它们放入一个字段数组里.
4,通过遍历,获取到对应的类型和名称,然后再通过构造函数,通过对象然后设置该值.
1>通过遍历,然后再通过fi[x].getName() 获取到此时这个字段的名字.
2>有了字段的名字,就可以获取到对应的字段,然后通过暴力反射使其可以访问和设置.
3>再通过对象和要求的值set;
* */
public class Demo12 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("cn.day11.testBean2"); //获取类的字节码.
Object bean = clazz.newInstance(); //创建一个新实例.
Field[] fi = clazz.getDeclaredFields(); //通过字节码获取到所有的Field对象,用数组接受.
ForMethod(fi,clazz,bean);
System.out.println(bean);
}
public static void ForMethod(Field[] fi,Class clazz,Object bean) throws Exception {
for(int x = 0; x < fi.length; x ++) //对Field对象数组进行遍历.
{
String s = fi[x].getType().toString(); //获取他们的字段类型,如果是包装就是类型全名
// System.out.println(s);
String ss = s.subSequence(s.lastIndexOf(".")+1, s.length()).toString(); //此处省略了判断.获取类型字符串
if(ss.equals("boolean") || ss.equals("Boolean")) //用类型字符串进行比较.如果是这个类型,就添加相应的值.
{
Field fiel = clazz.getDeclaredField(fi[x].getName()); //fi[x]获取字段名字,返回的是一个字符串.
fiel.setAccessible(true); //暴力请求.设置允许.
fiel.set(bean, true);
}
else if(ss.equals("String"))
{
Field fiel = clazz.getDeclaredField(fi[x].getName());
fiel.setAccessible(true);
fiel.set(bean, "www.itheima.com");
}
else if(ss.equals("int") || ss.equals("Integer"))
{
Field fiel = clazz.getDeclaredField(fi[x].getName());
fiel.setAccessible(true);
fiel.set(bean,100);
}
else if(ss.equals("double") ||ss.equals("Double"))
{
Field fiel = clazz.getDeclaredField(fi[x].getName());
fiel.setAccessible(true);
fiel.set(bean,0.01D);
}
}
}
}
class testBean2
{
private boolean b;
private Integer i;
private String str;
private double d;
public Boolean getB()
{
return b;
}
public void setB(Boolean b)
{
this.b = b;
}
public Integer getI()
{
return i;
}
public void setI(Integer i)
{ this.i = i;
}
public String getStr()
{
return str;
}
public void setStr(String str)
{
this.str = str;
}
public Double getD()
{
return d;
}
public void setD(Double d)
{
this.d = d;
}
@Override
public String toString() {
return "MyJavaBean [boo=" + b + ", i=" + i + ", s=" + str + ", d=" + d
+ "]";
}
作者:
李天富
时间:
2014-12-27 17:05
package com.itheima;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class Test7 {
/**
* 7、 存在一个JavaBean,它包含以下几种可能的属性:
1:boolean/Boolean
2:int/Integer
3:String
4:double/Double
属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:
String类型的默认值为字符串 www.itheima.com
int/Integer类型的默认值为100
boolean/Boolean类型的默认值为true
double/Double的默认值为0.01D.
只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现
* @param args
*
*
* 思路:
* 由于属性名未知,所以可以通过内省的方式,并使用BeanInfo的getPropertyDescriptors()方法
* 获得所有javaBean属性,然后遍历,将指定类型的属性设置为默认值。
*
*/
public static void main(String[] args)throws Exception {
//创建待设置的对象javaBean。
JavaBean jb = new JavaBean();
//调用IntroSpector类的getBeanInfo()方法获得该类的BeanInfo对象。
BeanInfo beaninfo = Introspector.getBeanInfo(jb.getClass());
//调用beaninfo对象的getPropertyDescriptors()方法得到该类的所有javaBean属性的数组。
PropertyDescriptor[] pds = beaninfo.getPropertyDescriptors();
//遍历该数组,通过getPropertyType()方法判断属性类型,将指定类型的属性设置为默认值。
for(PropertyDescriptor pd:pds)
{
if(pd.getPropertyType()==boolean.class)
{
pd.getWriteMethod().invoke(jb, true);
}
if(pd.getPropertyType()==int.class)
{
pd.getWriteMethod().invoke(jb, 100);
}
if(pd.getPropertyType()==String.class)
{
pd.getWriteMethod().invoke(jb, "www.itheima.com");
}
if(pd.getPropertyType()==double.class)
{
pd.getWriteMethod().invoke(jb, 0.01D);
}
}
//验证属性是否设置成功。
System.out.println(jb.isFlag());
System.out.println(jb.getN());
System.out.println(jb.getStr());
System.out.println(jb.getS());
System.out.println(jb.getD());
System.out.println(jb.method());
}
}
复制代码
这是我入学测试的时候做的,你可以参考一下。
作者:
Rain2692
时间:
2014-12-27 21:12
你可以看看我的代码。。。
作者:
Rain2692
时间:
2014-12-27 21:37
本帖最后由 Rain2692 于 2014-12-27 21:41 编辑
/**
*第八题:
*存在一个JavaBean,它包含以下几种可能的属性:
* 1:boolean/Boolean
* 2:int/Integer
* 3:String
* 4:double/Double
*属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:
String类型的默认值为字符串 www.itheima.com
int/Integer类型的默认值为100
boolean/Boolean类型的默认值为true
double/Double的默认值为0.01D.
*只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现
*
*/
public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
JavaBeanTest pt = new JavaBeanTest();//创建对象
ArrayList<String> al = new ArrayList<String>();//创建集合为了存储成员变量的名字
ArrayList<Object> Values = new ArrayList<>(); //创建集合,不施加泛型约束,为了存取将要赋的值
Values.add(true);//依次存入将要设置的默认值
Values.add(100);
Values.add("www.itheima.com");
Values.add(0.01D);
Field[] fd = pt.getClass().getDeclaredFields();//利用反射机制获取成员变量
for(Field f :fd)
{
if(!f.isAccessible())//暴力反射
f.setAccessible(true);
String s =f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);//javaBean的函数设置规则,首字母大写,获取成员变量名
al.add(s);//将转换后的成员变量名加入集合
}
String PropertyName = null;
Object value = null;
//然后通过循环遍历,进行赋值操作
for(int i=0;i<al.size();i++)
{
PropertyName = al.get(i);
value = Values.get(i);
setProperties(pt, PropertyName, value);
}
//取值操作如下,打印出默认值来
for(int i=0;i<al.size();i++)
{
PropertyName = al.get(i);
System.out.println(PropertyName.toLowerCase()+": "+getProperty(pt, PropertyName));
}
}
//抽取成一个方法 ,传值最后将处理后的值返回。
private static Object getProperty(Object pt, String PropertyName)
throws IntrospectionException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(PropertyName,pt.getClass());
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(pt);
return retVal;
}
//抽取成一个方法,传值进行处理设置默认值
private static void setProperties(Object pt, String PropertyName,
Object value) throws IntrospectionException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(PropertyName,pt.getClass());
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt, value);
}
复制代码
作者:
Rain2692
时间:
2014-12-27 21:42
public class JavaBeanTest {
private Boolean bool = false;
private Integer integer = null;
private String str = null;
private double d = 0;
public Boolean getBool() {
return bool;
}
public Integer getInteger() {
return integer;
}
public String getStr() {
return str;
}
public double getD() {
return d;
}
public void setBool(Boolean bool) {
this.bool = bool;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
public void setStr(String str) {
this.str = str;
}
public void setD(double d) {
this.d = d;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2