中华考试网·阅读新闻
编程开发 > JSP > 文章内容

JSP编程教程:反射

2015-10-8编辑:ljnbset

  一、反射

  v 反射概念

  Reflect,反射是指在程序运行时获取自身的信息【自省】。在JAVA中只需要提供类所在的路径,就可以通过反射获取类的所有信息。

  v 获取类中的属性

  public class User {

  protected int a;

  private String username ;

  private String password ;

  public String getUsername() {

  return username;

  }

  public void setUsername(String username) {

  this.username = username;

  }

  public String getPassword() {

  return password;

  }

  public void setPassword(String password) {

  this.password = password;

  }

  }

  User u = new User();

  Field[] fields = u.getClass().getFields();//获取public修饰符

  for (Field field : fields) {

  System.out.println(field.getName());//获取属性的名称

  }

  Field[] fields1 = u.getClass().getDeclaredFields();

  //获取类中的所有属性

  for (Field field : fields1) {

  System.out.println(field.getName());

  }

  作业:

  1.获取属性的修饰符

  Field.getModifiers()

  Modifier.toString(field.getModifiers())

  2.获取属性的返回值类型

  field.getType().getName()

  v 构造函数

  ① 无参构造函数

  User uu = (User)Class.forName(path).newInstance();

  uu.setUsername("123");

  System.out.println(uu.getUsername());

  ② 有参的构造函数

  Constructor[] construs =

  (Constructor[]) Class.forName(path).getConstructors();

  //获取类的构造函数

  System.out.println(construs.length);//获取类中有几个构造函数

  for (Constructor constructor : construs) {

  int length = constructor.getParameterTypes().length;

  //获取构造函数中有几个参数

  if(length == 2){

  User user = constructor.newInstance("120","123456");

  //调用构造函数,并给构造函数填充值

  System.out.println(user.getUsername());

  }

  }

  ③ 获取父类或父接口

  Class.forName(path).getSuperclass():父类继承

  Class.forName(path).getInterfaces():父类实现

  ④ 调用方法

  1.动态地给方法注入值

  Method method =

  Class.forName(path).getMethod("setUsername", java.lang.String.class);

  User u =(User)Class.forName(path).newInstance();

  method.invoke(u, "1111");//u.setUsername("1111")

  System.out.println(u.getUsername());

  2.返回值

  Method method1 =

  Class.forName(path).getMethod("test", java.lang.String.class,java.lang.Integer.class);

  String value = (String)method1.invoke(u, "hello",1);

  System.out.println(value);

  作业:

  利用上述知识,做Hibernate的模拟

  最终效果:

  insert into country (id,contry) values('1','中国')

  Hibernate配置文件如下:

  Insert into country (id,name) values(getId(),getCountry())

  

  

  table="country" dynamic-update="true" >

  

  

  sales

  

  

  

  

  

  

  Insert into country (id,name) values(getId(),getCountry())

  要求:不要求配置配置文件,只需要将该配置文件用java语言模拟,将其可设置为:

  tableName="saless";

  map.put("id", "id");

  map.put("name", "contry");

  注意:hashMap中第一个字符为数据库对应的字段,第二个字符为pojo中对应的字段。

  public class Session {

  private Map map;

  private String table;

  public Session() {

  this.table = "country";

  map = new HashMap();

  map.put("id", "id");

  map.put("name", "contry");// 第一个字段为列名 第二个字段为类中属性

  map.put("sd", "loc");

  }

  public void add(Object o) {

  // insert into country (id,name) values(getId(),getCountry())

  String sql = "insert into " + this.table + "(";

  Set keys = map.keySet();

  String columnStr = "";

  String valueStr = "";

  String param = "";

  for (String key : keys) {

  columnStr += key+",";

  param = map.get(key);

  String methodName = "get"+ param.substring(0, 1).toUpperCase()+param.substring(1);

  try {

  Method method = o.getClass().getMethod(methodName);

  String value = (String)method.invoke(o);

  valueStr += value+",";

  } catch (SecurityException e) {

  e.printStackTrace();

  } catch (NoSuchMethodException e) {

  e.printStackTrace();

  } catch (IllegalArgumentException e) {

  e.printStackTrace();

  } catch (IllegalAccessException e) {

  e.printStackTrace();

  } catch (InvocationTargetException e) {

  e.printStackTrace();

  }

  }

  sql += columnStr.substring(0,columnStr.length()-1) +") values("+valueStr.substring(0,valueStr.length()-1)+")";

  System.out.println(sql);

  }

  }

JSP编程教程:数据池
咨询热线:4000-525-585(免长途费)