您的位置:首页 > 编程语言 > Java开发

Java中反射机制的应用

2014-02-26 10:52 344 查看
Java中反射机制可以方便的得到一直类的属性方法,如果有该类实例化的对象后,可以得到其相关的属性值,或是设置属性值。

最近在做Java上传接口,条件非常恶劣,也是新手最初涉猎,接收json字符串上传表数据,不知各位看官是否会有更好的方法。

上传时只给所传对象的json串,以及该对象对应的类名,注意只有类名,不是完整的包括包名在内的完整路径。自此,就想到用反射得到该类的Class,以便通过jsonutil,将json字符串转成Java对象。

首先就用到 clazz = Class.forName("com.me.entityeat."+objName);

对于Class.forName方法,入参需要类的完整路径,而现在只有类名,无奈之下,只能使用try -catch异常捕获,依次在捕获异常时使用另外一个包名,因为所有的包名是已知的,所以倒是很快,获取到Class.

拿到class后,我们很轻松的使用JsonUtil提供的方法,将字符串转成对象,这时问题又出现了,由于我们所保存的对象是hibernate one to many中的many一方,关系由one一方来维护,这时在many方存在的one方类属性不能为空,而且,在设置joincolumn值时,是取的这个类属性的id,但是这个类属性ID上传数据已经给了,由于技术选型不使用jdbc,那么此时就需要新建一个类属性的对象,并且取出many对象的关联ID,赋值给many的类属性。

此时问题来了,我们如何找到哪个属性是类属性?找到类属性后,如何new一个对象,又如何取出关联ID并赋值呢?

因为我的类中,除了关联的类属性,其他都是简单数据类型,此时,我就遍历方法,找到方法的参数是我所写的类属性,然后再初始化。

首先获取到该类的所有方法:

java.lang.reflect.Method[] methods = clazz.getMethods();

其次,遍历方法,然后判断方法的参数,或是返回值是否是自定义类型。

1、判断方法的参数:

for (java.lang.reflect.Method method:methods) {

if (method.getName().contains("get")) {

continue;

}

//获取方法的参数

Class<?>[] parameterTypes = method.getParameterTypes();

for (Class<?> clas : parameterTypes) {

//获取参数名称,getName

if (clas.getName().contains("com.me.entity")) {

try {

//通过获取的类名得到Class

Class subClazz = Class.forName(clas.getName());

//class实例化

Object obj = subClazz.newInstance();

java.lang.reflect.Method[] subMethods = subClazz.getMethods();

for (java.lang.reflect.Method subMethod:subMethods) {

if (subMethod.getName().contains("setId")) {

//执行类中的set方法,给已有对象的属性赋值

subMethod.invoke(obj, relaId);

}

}

此段代码只作为解释用,后面有无数的catch,在此忽略掉。、

操作已知Class的Field以及执行set方法

//通过实体获取Fields,通过已有Class,可以直接调用getDeclareFields方法。

Field[] fields = entity.getClass().getDeclaredFields();

for (Field field : fields) {

//循环fields找到我已知条件匹配的属性

if (field.getName().contains("Id")&&field.getName().length()>2) {

try {

//根据属性名,拼出气get方法名称

String methodName = "get"+String.valueOf(field.getName().charAt(0)).toUpperCase()+field.getName().substring(1) ;

try {

//通过方法名称,得到该属性的get方法

java.lang.reflect.Method fieldMethod = clazz.getMethod(methodName);

//执行set方法,赋值给对象

relaId = (String) fieldMethod.invoke(entity);

后续的过多异常捕获,就不再赘述。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: