反射

Java反射机制

在运行状态中,对任意一个类,都能够直到这个类的所有属性和方法
对于任意一个对象,都能够调用它的任意属性和方法
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
利用反射调用它类中的属性和方法时,无视修饰符

就是说:
利用反射可以无视修饰符获取类里面所有的属性和方法
先获取配置文件中的信息,动态获取信息并创建对象和调用方法
在这里插入图片描述

获取Class类的对象

  • Class.forName(“全类名”)
  • 类名.class
  • 对象。getClass()
package com.myreflect;

/**
 * 获取class对象的三种方式
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //Class类中的静态方法forName("全类名")
        //全类名   包名+类名
        Class clazz= Class.forName("com.myreflect.Student");
        System.out.println(clazz);

        //通过class属性来获取
        Class clazz2 = Student.class;
        System.out.println(clazz2);

        //利用对象的getClass方法获取class对象
        //getClass方法是定义在Object类中
        Student s = new Student();
        Class clazz3 = s.getClass();
        System.out.println(clazz3);

        
        System.out.println(clazz == clazz2);
        System.out.println(clazz3 == clazz2);

    }
}

反射获取构造方法并使用

package com.myreflect2;

import java.lang.reflect.Constructor;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        // method1();
        // method2();
        //method3();
        //method4();

    }

    private static void method4() throws ClassNotFoundException, NoSuchMethodException {
        //返回单个构造方法对象
        Class clazz = Class.forName("com.myreflect2.Student");
        Constructor constructor = clazz.getDeclaredConstructor(String.class);
        System.out.println(constructor);
    }

    private static void method3() throws ClassNotFoundException, NoSuchMethodException {
        //返回单个公共构造方法对象
        Class clazz = Class.forName("com.myreflect2.Student");
        //小括号中一定要跟构造方法的形参保持一致
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        Constructor constructor1 = clazz.getConstructor();
        System.out.println(constructor1);
        System.out.println(constructor);
    }

    private static void method2() throws ClassNotFoundException {
        //返回所有构造方法对象的数组
        Class clazz = Class.forName("com.myreflect2.Student");
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }

    private static void method1() throws ClassNotFoundException {
        //返回所有公共构造方法对象的数组
        /**
         * 获取Class对象
         */
        Class clazz = Class.forName("com.myreflect2.Student");
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }
}

获取构造对象并创建对象

package com.myreflect3;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 获取Contructor对象并创建对象
 */

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //newInstance (Object... initargs) 根据指定的构造方法创建对象
        //method1();
        //method2();
        //method3();

    }

    private static void method3() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取一个私有的构造方法并创建对象
        Class clazz = Class.forName("com.myreflect3.Student");
        //获取一个私有化的构造方法
        Constructor constructor = clazz.getDeclaredConstructor(String.class);

        /**
         * 被private 修饰的成员,不能直接使用
         * 如果用反射强行获取并使用,需要临时取消访问检查
         */
        constructor.setAccessible(true);
        //创建对象
        Student student = (Student) constructor.newInstance("zhangsan");
    }

    private static void method2() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取对象
        Class clazz = Class.forName("com.myreflect3.Student");
        //获取构造方法对象
        Constructor constructor = clazz.getConstructor();
        //利用空参来创建Student的对象
        Student student = (Student) constructor.newInstance();
        System.out.println(student);
    }

    private static void method1() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取class对象
        Class clazz = Class.forName("com.myreflect3.Student");
        //获取构造方法对象
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        //利用newInstace 创建Student对象
        Student student = (Student) constructor.newInstance("zhangsan", 23);
        System.out.println(student);
    }
}

如果是非public,需要临时取消检查,然后再创建对象
setAccessible(boolean) 暴力反射

利用反射回去成员变量

package com.myreflect4;

import java.lang.reflect.Field;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        //method();
        //method1();
        //method2();
        //method3();

    }

    private static void method3() throws ClassNotFoundException, NoSuchFieldException {
        //返回单个成员变量对象
        Class clazz = Class.forName("com.myreflect4.Student");
        //获取money成员变量
        Field field = clazz.getDeclaredField("money");
        System.out.println(field);
    }

    private static void method2() throws ClassNotFoundException, NoSuchFieldException {
        //获取class对象
        Class clazz = Class.forName("com.myreflect4.Student");
        //获取name这个成员变量
        /**
         * 获取的成员变量必须真实存在
         * 并且是Public修饰的
         */
        Field field = clazz.getField("name");
        //

        System.out.println(field);
    }

    private static void method1() throws ClassNotFoundException {
        //返回所有成员变量对象的数组
        //获取class对象
        Class clazz = Class.forName("com.myreflect4.Student");

        //获取所有field对象
        Field[] fields = clazz.getDeclaredFields();

        //便利
        for (Field field : fields) {
            System.out.println(field);
        }
    }

    private static void method() throws ClassNotFoundException {
        //返回所有公共成员变量对象的数组
        //获取class对象
        Class clazz = Class.forName("com.myreflect4.Student");

        //获取Field对象
        Field[] fields = clazz.getFields();
        //遍历
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}

利用反射获取值和赋值

package com.myreflect5;

import java.lang.reflect.Field;

public class ReflectDemo1 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException {
        //method1();
        //method2();

    }

    private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        //获取class对象
        Class clazz = Class.forName("com.myreflect5.Student");
        //获取成员变量Field的对象
        Field field = clazz.getDeclaredField("money");
        //取消访问检查
        field.setAccessible(true);
        //调用get方法来获取值
        //创建一个对象
        Student student = (Student) clazz.newInstance();
        //获取指定对象money的值
        Object o = field.get(student);
        System.out.println(o);
    }

    private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        /**
         * 给obj对象的成员方法赋值
         */
        //获取class对象
        Class clazz = Class.forName("com.myreflect5.Student");

        //获取name这个Field对象
        Field field = clazz.getField("name");
        /**
         * 利用set方法进行赋值
         * 先创建一个Student对象
         *
         */
        Student student = (Student) clazz.newInstance();
        //有了对象才可以给指定对象进行赋值
        field.set(student, "zhangsan");
        System.out.println(student);
    }
}

获取Mthod对象

package com.myreflect6;

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

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //method1();
        //method2();
        //method3();
        //method4();
        //method5();

    }

    private static void method5() throws ClassNotFoundException, NoSuchMethodException {
        //返回单个成员方法对象
        Class clazz = Class.forName("com.myreflect6.Student");
        //获取一个成员方法show
        Method show = clazz.getDeclaredMethod("show");
        System.out.println(show);
    }

    private static void method4() throws ClassNotFoundException, NoSuchMethodException {
        //获取class对象
        Class clazz = Class.forName("com.myreflect6.Student");
        //获取一个有形参的方法funtion2
        Method method = clazz.getMethod("function2", String.class);
        System.out.println(method);
    }

    private static void method3() throws ClassNotFoundException, NoSuchMethodException {
        //返回单个公共成员方法
        Class clazz = Class.forName("com.myreflect6.Student");
        //获取成员方法function1
        Method method = clazz.getMethod("function1");
        //
        System.out.println(method);
    }

    private static void method2() throws ClassNotFoundException {
        //返回所有成员方法对象的数组,不含继承
        Class clazz = Class.forName("com.myreflect6.Student");
        //获取Method方法
        Method[] methods = clazz.getDeclaredMethods();
        //遍历
        for (Method method : methods) {
            System.out.println(method);
        }
    }

    private static void method1() throws ClassNotFoundException {
        //返回所有公共成员方法对象的数组,包扩继承
        //获取class对象
        Class clazz = Class.forName("com.myreflect6.Student");
        //获取成员方法对象
        Method[] methods = clazz.getMethods();
        //遍历
        for (Method method : methods) {
            System.out.println(method);
        }
    }

}

package com.myreflect6;

/**
 * 获取Field 对象
 */
public class Student {
    //私有的,无返回值
    private void show() {
        System.out.println("私有的show方法,无参返回值");
    }

    //公共,无参返回值
    public void function1() {
        System.out.println("function1方法,无参返回值");
    }

    //公共的,有参无返回值
    public void function2(String name) {

        System.out.println("function2方法,有参无返回值。参数为" + name);
    }

    //公共无参有返回值
    public String function3() {
        System.out.println("function3方法,无参有返回值");
        return "aaa";
    }

    //有参有返回值
    public String function4(String name) {
        System.out.println("function4,有参有返回值,参数为:" + name);
        return "aaa";
    }
}

利用反射获取成员方法并运行

在这里插入图片描述

package com.myreflect7;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取class对象
        Class clazz = Class.forName("com.myreflect7.Student");

        //获取Method对象  function4
        Method method = clazz.getMethod("function4", String.class);
        /**
         * 运行function4
         * 创建Student对象,当做方法调用者
         */
        Student student = (Student) clazz.newInstance();
        //运行方法
        Object rusult = method.invoke(student, "zhangsan");
        System.out.println(rusult);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值