Java反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
总结:反射就是将一个Java类中各个成分变成一个一个的对象,这体现了Java中一切皆对象。
一、Class类

  • 获取类的方法(常用)
    (1)、Object.getClass()方法,即object中的getClass()方法
    (2)、数据类型.class,即每个类都有一个class属性
    (3)、Class.forName(“真实路径,就是带包名的类路径,包名.类名 “)(最最最常用)
    注意:一个类在运行期间只产生一个类对象

二、method方法

1.构造方法

1).批量的方法:
public Constructor[] getConstructors():所有”公有的”构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2).获取单个的方法,并调用:
public Constructor getConstructor(Class… parameterTypes):获取单个的”公有的”构造方法:
public Constructor getDeclaredConstructor(Class… parameterTypes):获取”某个构造方法”可以是私有的,或受保护、默认、公有;
构造方法暴力访问: setAccessible(true)

调用构造方法: Constructor–>newInstance(Object… initargs)
2、newInstance是 Constructor类的方法(管理构造函数的类)

使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用

3、普通方法
(1) 、获取成员方法并调用:
批量的:
public Method[] getMethods():返回类的所有public方法,包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods():获取所有的成员方法,包括public, protected, default (package) 访问和private方法的Method对象,但不包括继承的方法。当然也包括它所实现接口的方法。
获取单个的:
public Method getMethod(String name,Class …parameterTypes): 参数:
name : 方法名;
Class … : 形参的Class类型对象
public Method getDeclaredMethod(String name,Class …parameterTypes)

调用方法:
Method –> public Object invoke(Object obj,Object… args):
参数说明:
obj : 要调用方法的对象;
args:调用方式时所传递的实参;

public static void main(String[] args){
        try {
            Class cls = Class.forName("com.mysql.jdbc.Driver");

            //表示获取当前类的所有方法(声明的方法 + 继承的方法)
            Method[] methods = cls.getMethods();

          //Method[] methods = cls.getDeclaredMethods();

            for(Method method : methods){
                System.out.println("------methodName--------->" + method.getName());
                System.out.println("------ReturnType--------->" + method.getReturnType());
                System.out.println("方法的返回值:");
                for(Class pt : method.getParameterTypes()){
                    System.out.println("         ReturnType--------->" + pt.getName());
                }
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }




    }

三、成员变量
1.批量的
1).Field[] getFields():获取所有的”公有字段”
2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
2.获取单个的:
1).public Field getField(String fieldName):获取某个”公有的”字段;
2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

设置字段的值:
Field –> public void set(Object obj,Object value):
参数说明:
1.obj:要设置的字段所在的对象;
2.value:要为字段设置的值;
四、总结
只要用到反射,先获得Class Object
没有方法能获得当前类的超类的private方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得
通常情况即使是当前类,private属性或方法也是不能访问的,你需要 设置压制权限setAccessible(true)来取得private的访问权。但说实话,这已经破坏了面向对象的规则,所以除非万不得已,请尽量少用。

你可能感兴趣的:(总结)