java反射的例子

Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

个人理解就是在运行时可以得到某个对象的所有信息,包括方法,类型,属性,方法参数,方法返回值以及可以调用该类的所有方法。

下面是两个例子:


package cn.test;


import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


/**
* Java Reflection Cookbook
*
* @author Michael Lee
* @since 2006-8-23
* @version 0.1a
*/

public class TestReflection {
/**
* 得到某个对象的公共属性
*
* @param owner, fieldName
* @return 该属性对象
* @throws Exception
*
*/
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();

Field field = ownerClass.getField(fieldName);

Object property = field.get(owner);

return property;
}

/**
* 得到某类的静态公共属性
*
* @param className 类名
* @param fieldName 属性名
* @return 该属性对象
* @throws Exception
*/
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);

Field field = ownerClass.getField(fieldName);

Object property = field.get(ownerClass);

return property;
}


/**
* 执行某对象方法
*
* @param owner
* 对象
* @param methodName
* 方法名
* @param args
* 参数
* @return 方法返回值
* @throws Exception
*/
public Object invokeMethod(Object owner, String methodName, Object[] args)
throws Exception {

Class ownerClass = owner.getClass();

Class[] argsClass = new Class[args.length];

for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}

Method method = ownerClass.getMethod(methodName, argsClass);

return method.invoke(owner, args);
}


/**
* 执行某类的静态方法
*
* @param className
* 类名
* @param methodName
* 方法名
* @param args
* 参数数组
* @return 执行方法返回的结果
* @throws Exception
*/
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);

Class[] argsClass = new Class[args.length];

for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}

Method method = ownerClass.getMethod(methodName, argsClass);

return method.invoke(null, args);
}


/**
* 新建实例
*
* @param className
* 类名
* @param args
* 构造函数的参数
* @return 新建的实例
* @throws Exception
*/
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);

Class[] argsClass = new Class[args.length];

for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}

Constructor cons = newoneClass.getConstructor(argsClass);

return cons.newInstance(args);

}



/**
* 是不是某个类的实例
* @param obj 实例
* @param cls 类
* @return 如果 obj 是此类的实例,则返回 true
*/
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}

/**
* 得到数组中的某个元素
* @param array 数组
* @param index 索引
* @return 返回指定数组对象中索引组件的值
*/
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}
}





package cn.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

import cn.IpUtils.IpBean;

public class TestObject {

/**
* 设置属性值
* @param list
* @param cla
* @return
*/
public ArrayList array2bean(ArrayList list, Class cla) {
ArrayList result = new ArrayList();
int filed_len = cla.getDeclaredFields().length;
System.out.println(":"+cla.getDeclaredFields().length);
for (int i = 0; i < list.size(); i++) {
Object[] o = (Object[]) list.get(i);
int length = filed_len < o.length ? filed_len : o.length;
try {
result.add(cla.newInstance());
for (int j = 0; j < length; j++) {
Method m = null;
String mName =cla.getDeclaredFields()[j].getName();
mName = mName.substring(0, 1).toUpperCase()+ mName.substring(1);
mName = "set" + mName;
m = cla.getMethod(mName, new Class[] { String.class });
//调用设置的方法,给属性赋值
m.invoke(result.get(i), new Object[] { o[j] == null ? "": o[j].toString() });
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}

/**
* 获取get的取值
* @param obj
* @return
* @throws Exception
*/
public String getObjectToString(Object obj) throws Exception{
Class cla=obj.getClass();
Method[] ma=cla.getDeclaredMethods();//获取所有声明的方法数组
Method method=null;
String methodName=null;
Object returnValue=null;
for(int i=0;i<ma.length;i++){
method=ma[i];
methodName=method.getName();//方法名
if(methodName.indexOf("get")==0){//以get开始的方法,排除set方法
returnValue=method.invoke(obj, null);//调用方法,相当于执行get方法得到的结果,这里返回的是一个对象
System.out.print(methodName+"::");
System.out.println(returnValue==null?"":returnValue.toString());
}
}
return "";
}

/**
* 获取对象的属性值,含有get方法的
* @param obj
* @return
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public String getAttributeValue(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Class cla=obj.getClass();
Field[] fds=cla.getDeclaredFields();
Field field=null;
String fieldName=null;
String methodName=null;
Method method=null;
Object returnValue=null;
for(int i=0;i<fds.length;i++){
field=fds[i];
fieldName=field.getName();
methodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
method=cla.getDeclaredMethod(methodName, null);
returnValue=method.invoke(obj, null);//调用方法,相当于执行get方法得到的结果,这里返回的是一个对象
System.out.print(methodName+"::");
System.out.println(returnValue==null?"":returnValue.toString());
}

return "";
}

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// IpBean.class
TestObject to=new TestObject();
IpBean ib=new IpBean();
ib.setFrom("from1");
ib.setPosition("position1");
ib.setTo("to1");
ib.setId(10);
to.getObjectToString(ib);
// to.getAttributeValue(ib);
}

}




package cn.IpUtils;

public class IpBean {
private String from; // IP段起始
private String to; // IP结束
private String position; // 地理名称
private int id = 0;

public String getFrom() {
return from;
}

public void setFrom(String from) {
this.from = from;
}

public String getTo() {
return to;
}

public void setTo(String to) {
this.to = to;
}

public String getPosition() {
return position;
}

public void setPosition(String position) {
this.position = position;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值