Java中反射机制的应用

来源:互联网 发布:jquery数组中移除元素 编辑:程序博客网 时间:2024/05/18 03:04

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);
后续的过多异常捕获,就不再赘述。



      


0 0
原创粉丝点击