我了解的java反射技术与大家讨论

该博客展示了Java代码,定义了两个Bean类TestClass和ClassTest,通过反射机制实现将TestClass的信息填充到ClassTest中。在TestFanShe类的tianChongBean方法里,获取两个Bean的属性,实例化对象,比较属性名并赋值,最后在main方法中调用该方法输出结果。

//这里为有值的Bean

package fanshe;

public class TestClass {
  private int id=2;
  private String name="3";
  public TestClass() {
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

//这里为要填充的Bean

package fanshe;

public class ClassTest {
  private int id;
  private String name;
  public ClassTest() {
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

//这里为操作的方法

package fanshe;

import java.lang.reflect.Field;

public class TestFanShe {
  public TestFanShe() {
  }

  /**
   * 填充Bean,将第一个Bean的信息放到第二个Bean中,但是我这里做的是两个Bean中有同样的信息
   * @param clas Class 有信息的Bean
   * @param cla Class 没有信息的Bean
   * @throws ClassNotFoundException
   * @throws IllegalAccessException
   * @throws InstantiationException
   * @return Object
   */
  public static Object tianChongBean(Class clas,Class cla) throws
      ClassNotFoundException, IllegalAccessException, InstantiationException {
    //获得第一个Bean中的所有属性
    Field[] fieldClas=clas.getDeclaredFields();
    //获得第二个Bean中的所有属性
    Field[] fieldCla=cla.getDeclaredFields();
    //得到Bean的绝对路径,但是这个得到的路径是class fanshe.TestClass
    String[] clasString=clas.toString().split("class");
    //得到Bean的绝对路径,但是这个得到的路径是class fanshe.ClassTest
    String[] claString=cla.toString().split("class");
    //在这里forName中的参数只能放fanshe.TestClass绝对路径,所以前面把class去掉,这里是实例化这个Bean
    Object objClas=clas.forName(clasString[1].trim()).newInstance();
    //在这里forName中的参数只能放fanshe.ClassTest绝对路径,所以前面把class去掉,这里是实例化这个Bean
    Object objCla=cla.forName(claString[1].trim()).newInstance();
    for (int i = 0; i < fieldClas.length; i++) {
      for (int j = 0; j < fieldCla.length; j++) {
        //设置属性可以访问,这里不设置为true,那么只能访问public类型
        fieldClas[i].setAccessible(true);
        fieldCla[j].setAccessible(true);
        //这里判断两个属性名是否相等
        if(fieldClas[i].getName().equals(fieldCla[j].getName()))
        {
          //这里将得到TestClass的属性植设置到ClassTest的属性中
          fieldCla[j].set(objCla,fieldClas[i].get(objClas));
          System.out.println(fieldCla[j].get(objCla));
        }
      }
    }
    return objCla;
  }
  public static void main(String[] args) {
    try {
      //这里为调用的方法
      ClassTest classTest=(ClassTest)tianChongBean(TestClass.class, ClassTest.class);
      System.out.println(classTest.getId());
      System.out.println(classTest.getName());
    }
    catch (InstantiationException ex) {
      System.out.println("InstantiationException"+ex.getMessage());
    }
    catch (IllegalAccessException ex) {
      System.out.println("IllegalAccessException"+ex.getMessage());
    }
    catch (ClassNotFoundException ex) {
      System.out.println("ClassNotFoundException"+ex.getMessage());
    }
  }
}

 

http://www.serverjia.cn/ 电脑配置站

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值