反射
什么是反射?反射的作用
反射是利用类的加载机制,对类进行动态操作的一种体现,操作类的成员属性和方法(一般都是公共的)。
反射的作用:在现在的J2EE应用领域中所使用的较多,一般都采用反射来对“类和表的映射文件”进行动态解析并实例化的操作,常见于ORM映射技术中。有时也在一些轻量级容器中能见到此技术的应用,比如Spring。总之,J2EE中一般都能见到此技术的运用。普通的反射效率较低,但可操作性较强,有时候也配合动态代理技术来完成相关运用。
实例化步骤
1. 调用Class中的forName()方法根据类名实例化一个Object类型的对象
2. 强制转化成所需类型
| 利用反射的知识拼装sql语句 原来在DAO中的操作如下: Insert into usertb valuse(user.getName,user.getPwd)
改成反射动态拼装,如何做? 已知条件:已赋值的对象 |
见到“class...”说明此处的参数是类型数组,如果见到“object…”说明此处的参数是对象数组
利用反射的一些例子
反射的方法
SoftDevoloper.java
| SoftDevoloper.java |
| package com.ibm.dto;
public class SoftDevoloper { /** * 软件工程师 * @param devId * @param devName * @param age */
public SoftDevoloper(int devId,String devName,int age){ this.devId=devId; this.devName=devName; this.age=age; }
public SoftDevoloper(){
}
//编号 private int devId; //名称 private String devName; //年龄 private int age; //技能 private String[] skill;
public int getDevId() { return devId; } public void setDevId(int devId) { this.devId = devId; } public String getDevName() { return devName; } public void setDevName(String devName) { this.devName = devName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }
public String[] getSkill() { return skill; }
public void setSkill(String[] skill) { this.skill = skill; }
}
|
ArgDemo.java
|
|
| package com.ibm.test;
/** * 反射中方法多个参数的调用类 * @author Administrator * */ public class ArgDemo {
/** * 说话 * @param uname 用户 * @param msg 说的内容 * @param len 说的长度 */ public void say(String uname,String msg,int len){
System.out.println(uname+"说"+msg+"一共"+len+"个长度"); }
}
|
Test.java
| Test.java |
| package com.ibm.test;
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;
import com.ibm.dto.SoftDevoloper;
public class Test {
public void GetInstance() {
//生成一个开发人员的实例对象 Object obj; try { obj = Class.forName("com.ibm.dto.SoftDevoloper").newInstance(); //强制转换成所需类型 SoftDevoloper sdl=(SoftDevoloper)obj; sdl.setDevName("詹姆斯"); System.out.println(sdl.getDevName());
} catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 测试获取类中的方法 * @param args */ public void testMethod() { try { //根据类名找到对象 Class sodCls=Class.forName("com.ibm.dto.SoftDevoloper"); //返回方法数组 Method[] method=sodCls.getDeclaredMethods(); //循环操作方法 for (Method method2 : method) { System.out.println("方法名是:"+method2.getName());
} } catch (ClassNotFoundException e) { e.printStackTrace(); } }
/** * 操作属性 */ public void testField(){
Class sodCls; try { sodCls = Class.forName("com.ibm.dto.SoftDevoloper");
Field[] field=sodCls.getDeclaredFields();
for(Field field2:field){ System.out.println("属性名:"+field2.getName()); }
} catch (ClassNotFoundException e) { e.printStackTrace(); } }
/** * 类中构造器 * @param args */ public void testConst(){
Class sodCls; try { sodCls = Class.forName("com.ibm.dto.SoftDevoloper"); Constructor[] constr=sodCls.getConstructors();
for(Constructor constructor:constr){ System.out.println("构造器:"+constructor.getName()); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
}
/** * 方法的操作 */ public void methodOpe |