57°

Java反射

能够分析类能力的程序叫做反射,它的作用包括:

  • 在运行时分析类的能力
  • 在运行时查看对象
  • 实现通用的数组操作代码
  • 利用Method对象操作类

在jvm中运行时的类型信息都包含在一个Class对象,Object类中的getClass方法可以返回一个Class对象:

Employee emp = new Employee();
System.out.println(emp.getClass().getName());

还可以调用静态方法forName根据类名获得对应的Class对象:

try {
	Class<?> aClass = Class.forName("com.ytuan.Employee");
	} catch (ClassNotFoundException e) {
	e.printStackTrace();
}
  • 会抛出一个ClassNotFoundException异常

Class类中还有一个newInstance方法,可以动态的创建一个对象:

Employee emp = null;
emp = emp.getClass().newInstance();
  • newInstance方法会调用Employee默认的无参构造,如果没有,那么就会抛出异常。
  • 结合newInstance和forName方法可以根据类名创建对象,想想JDBC数据库连接的代码。

利用反射分析类的能力

在java.lang.reflect包下有是三个类,Field, Method, Constructor分别描述一个类的属性,方法,构造器。都有一个方法getName得到对应的名称,Field类可以根据getType方法得到属性的Class类型,Method, Constructor都有报告参数类型的方法。这个三个类对应一个getModifiers方法,用来描述被修饰的情况,包括public,private,final,static。

Class类中的getFields、getMethods和getConstructors方法将分别返回类提供的 public 域、 方法和构造器数组, 其中包括超类的公有成员。 Class 类的 getDeclareFields、 getDeclareMethods 和 getDeclaredConstructors 方法将分别返回类中声明的全部域、 方法和构造器, 其中包括私有和受保护成员, 但不包括超类的成员。

    public static void main(String[] args) throws Exception {
    Class&lt;?&gt; aClass = Class.forName("java.lang.String");
    String parentClassName = aClass.getSuperclass().getName();

    System.out.println("String的父类:" + parentClassName);

    String stringModifier = Modifier.toString(aClass.getModifiers());
    System.out.println("String的修饰符:" + stringModifier);

    Field[] declaredFields = aClass.getDeclaredFields();

    System.out.println("String类的属性:");

    for (Field field : declaredFields
    ) {
        System.out.println(field.getName() + "\t" + field.getType().getName());

    }

    Method[] declaredMethods = aClass.getDeclaredMethods();

    for (Method method : declaredMethods
    ) {
        System.out.println(method.getName());


        Class&lt;?&gt;[] parameterTypes = method.getParameterTypes();

        for (Class aType : parameterTypes
        ) {
            System.out.println(aType.getName());
        }
        System.out.println("++++++++++++++");
    }
}

本文由【ytuan996】发布于开源中国,原文链接:https://my.oschina.net/ytuan996/blog/3128455

全部评论: 0

    我有话说: