JSP编程教程:反射
一、反射
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
(Constructor
//获取类的构造函数
System.out.println(construs.length);//获取类中有几个构造函数
for (Constructor
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
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
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);
}
}