首页投稿(暂停使用,暂停投稿)Java学习笔记Android 技术开发

Java--Class类相关与反射重温

2016-11-05  本文已影响770人  androidjp

一、注意点

二、Class类能给我们什么信息(常见):

public static Field[] getFieldList(Class clazz) {
    Field[] fields = clazz.getDeclaredFields();///获取类中所有的属性(忽略访问修饰符)
    for (Field fieid : fields) {
        Type type = fieid.getType();///获取属性类型
        System.out.println(Modifier.toString(fieid.getModifiers())+" "+type.getTypeName() + " " + fieid.getName());
    }
    return fields;
}

关键点:

public static Method[] getMethodList(Class clazz) {
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        ///分析每一个方法
        getMethodMsg(method);
    }
    return methods;
}
/**
 * 获取Method的返回值类型和参数类型等信息
 * @param method
 */
public static void getMethodMsg(Method method) {
    StringBuilder sb = new StringBuilder();
    ///获取访问权限
    sb.append(Modifier.toString(method.getModifiers())+" ");
    ///返回值类型
    Class<?> returnType = method.getReturnType();
    ////参数类型
    Class[] paramsTypeList = method.getParameterTypes();
    sb.append(returnType.getName()).append("
 ").append(method.getName()).append("(");
    for (Class paramsType : paramsTypeList) {
        sb.append(paramsType.getName()).append(",");
    }
    sb.append(")");
    ///删除多余的","号
    if (sb.lastIndexOf(",") == sb.length() - 1) {
        sb.delete(sb.length() - 2, sb.length() - 1);
    }
    System.out.println(sb.toString());
}

关键点:

public static void getConstructorMsg(Object obj) {
    Class clazz = obj.getClass();
    ///封装了构造函数的信息
    Constructor[] constructors = clazz.getDeclaredConstructors();
    for (Constructor item:constructors){
        System.out.print(item.getName()+"(");
        Class[] paramTypes = item.getParameterTypes();
        for (Class type: paramTypes){
            System.out.print(type.getName()+",");
        }
        System.out.println(")");
    }
}

关键点:

//动态生成类对象(无参构造函数)
Class<MyObj> clazz = (Class<MyObj>)MyObj.getClass();
T obj = clazz.newInstance();
//动态生成类对象(有参构造函数)
Class[] classes = new Class[]{Integer.class, String.class};
Object[] values = new Object[]{100, "hello world"};
Constructor<C> constructor = clazz.getDeclaredConstructor(classes);
C res = (C) constructor.newInstance(values);
如:
Animal dog = new Dog();///Dog是Animal的子类
boolean b = dog instanceof Dog;//判断dog这个对象是不是Dog类型的实例,结果为true

方式二:class对象.isInstance(类对象)

如:
Animal dog = new Dog();///Dog是Animal的子类
boolean b = Dog.class.isInstance(dog);

三、反射的基本用法:

  1. 调用方法Object 返回值 = method.invoke(对象, 参数值列表)
    相当于:对象.method(参数值列表)
    如:
Person xiaoming  = new Person();
Class c = xiaoming.getClass();
//Method m = c.getMethod("print", new Class[]{int.class, int.class});
//m.invoke(xiaoming, new int[]{1,2});
Method m = c.getMethod("print", int.class, int.class);
m.invoke(xiaoming, 1,2);

唯一确定某个方法的因素:方法名称 + 方法参数列表

  1. 修改属性Field.set(对象, 要修改的field值)
    相当于:对象属性赋值操作
    如:
Field field = teacher.getClass().getDeclaredField("name");//获取teacher对象的name属性
field.setAccessible(true);//无视field的访问权限问题
field.set(teacher, "小明老师");

四、关于集合的反射

List<String> list = new ArrayList<>();
list.add("hello");///添加元素“hello”
try {
    Method methodAdd = list.getClass().getMethod("add", Object.class);
    methodAdd.invoke(list,1);///添加元素1
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
    e.printStackTrace();
} 
System.out.println(list.toString());
///以下遍历报错:java.lang.ClassCastException
///for (String item:list){
///    System.out.println(item);
///}

五、Java反射相关的异常

上一篇 下一篇

猜你喜欢

热点阅读