java 从零开始,学习笔记之基础入门<反射>(二十九)(一)

2014-11-24 08:14:31 · 作者: · 浏览: 0

反射

什么是反射?反射的作用

反射是利用类的加载机制,对类进行动态操作的一种体现,操作类的成员属性和方法(一般都是公共的)。

反射的作用:在现在的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