(已完结 2015-12-30更新)Java-反射(一)

本文是个人的学习笔记,仅供参考,如有问题,欢迎私信指出!

PS:本人更新进度较慢,未完结的文章会在标题注明,完结后也会在标题注明。

反射(Reflection)是Java 高级编程必备的一个概念,本文针对Java初学者,对反射做一个简单的介绍。

1.反射的作用

反射在Java中通常应用于JavaBeans和Android开发中,其主要作用是分析类的能力。使用反射机制,可以:

        在程序运行过程中对类的能力和构造进行分析。

        在运行中查看某一类的方法,供所有类使用(invoke方法)。

        实现一个可以包含多个数据类型的数组或者集合。

2.反射的基础——Class类

Class类是类(class)的抽象,任何一个class都是Class类的一个对象。这一对象被称为该类的类类型。Java中,获取一个class的类类型通常有以下三种方法:

Class c1 = Object.class;
Class c2 = object.getClass();
Class c3 = Class.forName("Object");


三种方法都可以获取某一类的class类对象,值得一提的是,每一个类的class类对象是唯一的。也就是说,下列代码:

System.out.println(c1==c2);
System.out.println(c2==c3);

执行后打印的值均为true.

在获取到class对象后,常用newInstance()方法去构造一个该类的类对象,而不是调用类本身的构造方法。


3.反射对类结构的分析功能

在获得某个类的类类型后,通过反射机制可以对该类的结构进行分析。一个类主要包括三个部分:

(1)方法信息:包括类中所有方法的返回值,权限修饰符,方法名,参数类型。

(2)成员变量信息:包括类中所有成员变量的权限修饰符,变量类型,变量名。

(3)构造信息:包括类中所有的构造方法。

下面分三小节简述下或者三个部分信息的主要方法:

3.1 获取类的方法信息

      在java.lang.reflect包中,Method类主要负责处理和方法有关的操作。一个Method对象表示一个方法。因此,要获取一个类的所有方法信息,首先需要将类中的所有方法转换为Method对象就行处理。在class类中,提供了两个方法供使用:

Class c = Class.forName("classname");
Method[] methods = c.getMethods();
Method[] declaredMethods = c.getDeclaredMethods();

其中,getMethods()方法是获取类中所有public方法(包括从父类和接口中继承的方法),getDeclaredMethods()方法是获取类中所有自己声明的方法(不包括继承方法)。

接下来遍历Method数组,获取每个方法的信息。详细方法如下

public void printMethodMessage(Object object) {
    Class c = Class.forName(object);
    Method[] methods = c.getMethods();
    Method[] declaredMethods = c.getDeclaredMethods();

    for(Method m:methods) {
        Class returnType = m.getReturnType();//获取返回值的类类型
        String name = m.getName();			//获取方法名
        Parameter[] parameters = m.getParameters();	//获取参数
        String methodInfo = returnType.getName() + "  " + name + "  (";//将方法信息整理成字符串
        for(Parameter pm:parameters) {
            methodInfo += pm.getParameterizedType().getTypeName() + " " + pm.getName() + ",";
        }
        methodInfo += ")";
        System.out.println(methodInfo);//控制台输出方法信息
    }
}


3.2获取类的成员变量信息

在java.lang.reflect包中,Field类负责变量的表示和操作。一个Field对象表示一个变量。与获取方法信息思路相同,如果要获取一个类的所有成员变量信息,将类中所有成员变量转换为Field对象进行处理。class类同样提供了两个方法获取类中的Field对象。

<span style="font-size:12px;">Class c = Class.forName("classname");
Field[] fields = c.getFields();
Field[] declaredFields = c.getDeclaredFields();</span>
与getMethods()和getDeclaredMethods()相类似,getFields()获取类中所有public成员变量,包括继承;getDeclaredFields()获取类中所有自己声明的成员变量,不包括继承。

获取成员变量信息的详细代码如下

public static void printVariableMessage(Object object) {
	Class c = object.getClass();
	Field[] fields = c.getDeclaredFields();
	for(Field f:fields) {
		System.out.println(f.getType().getName() + "   " + f.getName());
	}
}


3.3获取类的构造方法信息

在java.lang.reflect包中,Constructor类专门处理构造方法。(构造方法不用Method处理)。class类提供一个方法获取类中的所有构造方法。

<span style="font-size:12px;">Class c = Class.forName("classname");
Constructor[] cons = c.getConstructors();</span>
剩余的部分参考3.1,但请注意,构造方法不存在返回值!

(PS:第一部分已完结,后续内容会在3-4天后继续更新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值