栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Java反射

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java反射

能够分析类能力的程序成为反射,反射机制可以用来:

  • 在运行时分析类的能力
  • 在运行时检查对象
  • 实现泛型数组操作代码
  • 利用Method对象
1. Class类

        在程序运行期间,Java运行时系统始终为所有对象维护一个运行时类型标识。这个信息会跟踪每个对象所属的类。虚拟机利用运行时类型信息选择要执行的正确的方法。可以使用一个特殊的Java类访问这些信息。保存这些信息的类型为Class,Object类中的getClass()方法将会返回一个Class类型的实例。

获取Class对象的三种方法:

  • .getClass()
Employee e;
...
Class cl = e.getClass();
String name = cl.getName();
//getName() 返回类的名字
  • Class.forName() 使用静态方法获得类名对应的Class对象
String className = "java.lang.Double";
Class cl = Class.forName(className);
  • 若T是任意的Java类型(或void关键字),T.class将代表匹配的类对象
Class cl1 = Random.class;
Class cl2 = int.class;

虚拟机为每个类型管理一个唯一的Class对象,因此可以用==运算符实现对两个类的比较,例如

if(e.getClass() == Employee.class)...

 若e是Employee的一个实例,返回true,但若是某个子类则是false。

2.Field、Method、Constructor

        java.lang.reflect包中有Field、Method、Constructor三个类,分别用于描述类的字段,方法及构造器,这三个类都有getName()方法,用于返回对应的名称。Modifier.toString(XX.getModifiers())方法用于返回使用的修饰符。(若不用toString则返回一个整数)

2.1 Field类

        用于获取类中字段的信息

//@Param cl a Class
Field[] fields1 = cl.getDeclaredFields();//返回所有出现在类声明中的字段,不包括超类的公共成员
Field[] fields2 = cl.getFields();//返回这个类支持的公共字段,包括超类的公共成员
Field field1 = cl.getField(String name);//根据name或者Field对象
Field field2 = cl.getDeclaredField(String name);

Object get (Object obj);
//返回obj对象中用这个Field对象描述的字段的值
void set(Object obj,Object newValue);
//将obj对象中这个Field对象描述的字段设置成一个新值
2.2 Method类

        用于获取类中方法信息

//@Param cl a class
Method[] methods1 = cl.getMethods();//返回所有公共方法,包括从超类中继承的方法
Method[] methods2 = cl.getDeclaredMethods();//只返回这个类或接口的全部方法,不包括继承来的方法
Method method1 = cl.getMethod(String name, Class... parameterTypes);
Method method2 = cl.getDeclaredMethod(String name, Class... parameterTypes);
//通过方法名及参数类型返回method

public Object invoke(Object obj, Object... args);
//调用包装在当前Method对象中的方法,第一个参数是隐式参数,其余的对象提供了显示参数,对于静态方法
//第一个参数可以忽略,若返回类型是基本类型,invoke会返回其包装器类型
2.3 Constructor类 3. 其他内容 3.1 借助反射机制将dto转成map
public static Map dtoToMap(Object obj){
    Map map = new HashMap();
    Class cla = obj.getClass();
    do{
       Field[] fields = cla.getDeclaredFields();
       for(Field field:fields){
            String name = field.getName();
            try {
               Method method = cla.getMethod("get"+initCap(name),null);
               map.put(name,method.invoke(obj,null));
            }
            catch (Exception e){
            }
        }
        cla = cla.getSuperclass();
   }while(cla != Object.class);
   return map;
}

private static String initCap(String name) {
    name = name.toLowerCase();
    String str = name.substring(0,1);
    str = str.toUpperCase();
    String newStr = str+name.substring(1);
    return newStr;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/891106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号