java反射学习笔记

2016-09-07  本文已影响27人  liut_2016

java中一切皆对象,也就是说 类,方法,变量 他们本身也是对象.

类是java.lang.Class类的对象,称类的类类型
成员变量是java.lang.reflect.Field对象
成员方法是java.lang.reflect.Method对象

知识结构

java reflect 基础.png
//用以测试的类
class A {
    public int a;
    public String b;
    public A() {}
    public A(int a) {}
    public A(int a, String b) {}
    public void m1() {}
    public String m2(int a) {
        return "I am Method m2 !" + a;
    }
}

代码

package xyz.liut.classdemo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created by liut on 16-9-6.
 * Class 测试,分析类的成员变量,方法,构造器
 */

public class ClassUtil {


    public static void main(String... args) {

        ClassUtil.printClassInfo(new A());

    }


    public static void printClassInfo(Object obj) {
        //c为obj的类类型
        Class c = obj.getClass();

        System.out.println("类的名字:" + c.getName());

        printClassFieldMessage(obj);
        printClassConstructorMesage(obj);
        printClassMethodMessage(obj);
    }

    /**
     * 获取类的成员变量
     * getFields() 所有public变量 包括继承的
     * getDeclaredFields() 所有自己定义的变量,所有访问权限
     */
    public static void printClassFieldMessage(Object obj) {
        Class c = obj.getClass();
        System.out.println("成员变量列表");
        Field[] fs = c.getDeclaredFields();
        for (Field f : fs) {
            Class fieldType = f.getType();
            String fieldName = f.getName();
            System.out.println(fieldType.getSimpleName() + " " + fieldName + ";");
        }
    }

    /**
     * 获取类的构造方法
     * getConstructors() 获取所有public构造器
     * getDeclaredConstructors() 获取所有的构造器
     */
    public static void printClassConstructorMesage(Object obj) {
        System.out.println("构造方法列表");
        Class c = obj.getClass();
        Constructor[] cs = c.getDeclaredConstructors();
        for (Constructor constructor : cs) {
            String constructorName = constructor.getName();
            System.out.print(constructorName + " (");
            Class[] constructorParamTypes = constructor.getParameterTypes();
            for (Class constructorParamType : constructorParamTypes) {
                System.out.print(constructorParamType.getSimpleName() + ",");
            }
            System.out.println(")");
        }
    }


    /**
     * 获取类的成员方法
     * getMethods() 获取所有public方法,包括继承而来的
     * getDeclaredMethods() 获取所有自定义方法,无论访问权限
     */
    public static void printClassMethodMessage(Object obj) {
        Class c = obj.getClass();
        System.out.println("方法列表");
        Method[] ms = c.getDeclaredMethods();
        for (Method m : ms) {
            //返回值类型的类类型
            Class returnType = m.getReturnType();
            //方法名
            String methodName = m.getName();

            System.out.print(returnType.getSimpleName() + " " + methodName + "(");
            //参数列表的类类型
            for (Class paramType : m.getParameterTypes()) {
                System.out.print(paramType.getName() + ",");
            }
            System.out.println(")");

        }
    }


}

执行结果

类的名字:xyz.liut.classdemo.A
成员变量列表
int a;
String b;
构造方法列表
xyz.liut.classdemo.A ()
xyz.liut.classdemo.A (int,String,)
xyz.liut.classdemo.A (int,)
方法列表
void m1()
String m2(int,)
package xyz.liut.classdemo;

import java.lang.reflect.Method;

/**
 * Created by liut on 16-9-7.
 */
public class MethodUtil {

    public static void main(String... args) {
        invoke(new A(), "m2");
    }

    /**
     * 通过反射 执行对应对象的对应方法.
     * c.getMethod() 获取指定方法,传入方法名,参数类型的可变数组 public 权限 包括继承
     * c.getDeclaredMethod() 所有自己声明的方法
     *
     * @param obj        任意对象
     * @param methodName 对应方法名
     */
    public static void invoke(Object obj, String methodName) {
        Class c = obj.getClass();
        Method m = null;
        try {
            m = c.getMethod(methodName, int.class);
            //若方法有返回值,即o,若无则o==null;
            Object o = m.invoke(obj, 1);
            System.out.println(o);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

输出结果为
I am Method m2 !1

上一篇 下一篇

猜你喜欢

热点阅读