美文网首页
java反射学习笔记

java反射学习笔记

作者: liut_2016 | 来源:发表于2016-09-07 11:01 被阅读27次

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

相关文章

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • Java学习笔记之反射机制

    title: Java学习笔记之反射机制tag: Javacategories: Java 理论介绍 为了便于理解...

  • Android Kotlin 反射使用笔记

    前言 java反射的写法,做下笔记 反射用法

  • Java反射由浅入深

    分享一下学习反射的笔记,了解反射之前要先了解一下java的class类。 1. Class类 Java除了基本类型...

  • JNI开发学习之C反射调用java方法

    前面记录了调用C的学习笔记,现在来记录一下C反射调用Java的笔记。JNI开发学习之调用C方法 Android开...

  • 2021校招 复习总结

    笔记导航: JAVA: 泛型 反射和动态代理 注解 JAVA多线程 ReentrantLock,Volatile,...

  • Java反射机制学习笔记

    上一篇《java注解学习笔记》中最后说到了注解的实现主要依赖java的反射机制,那么这一篇主要介绍一下java的反...

  • JAVA学习笔记之 反射

    反射:通过一个class文件对象来使用该class文件中的构造方法,成员变量,成员方法。 如何获取Class类文件...

  • java学习笔记之反射

    1.在java语言中,静态的成员变量,普通数据类型类等等都是对象,类也是对象,是java.lang.Class类的...

  • java反射学习笔记

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

网友评论

      本文标题:java反射学习笔记

      本文链接:https://www.haomeiwen.com/subject/zqsjettx.html