你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Java中的反射

2021-11-16 10:05:59

Java中的反射

什么是反射呢?

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

反射的优缺点

优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码。

哪里用到反射机制?

1.JDBC中,利用反射动态加载了数据库驱动程序。
2.Web服务器中利用反射调用了Sevlet的服务方法。
3.Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
4.很多框架都用到反射机制,注入属性,调用方法,如Spring。

获取Class对象的三种方式

①类名。Class属性
使用类的class属性来获取该类的class对象。
例如:Student.class将会返回Student类对应的class对象 。
测试时,最方便。

②对象名.getClass()方法
使用对象的getClass()方法,返回该对象所属类对应的class对象 ,该方法是Object类中的方法,所有的Java对象都可以调用该方法。

③Class.forName(全类名)方法
使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的路径,也就是完整包名的路径 。
灵活性高

	 // 1:使用类的class属性来获取该类的class对象。例如:Student.class将会返回Student类对应的class对象
        Class<Student> c1=Student.class;
        System.out.println(c1);

        Class<Student> c2 = Student.class;
        System.out.println(c1==c2);
        System.out.println("--------");

        //使用对象的getClass()方法,返回该对象所属类对应的class对象
        Student s =new Student();
        Class<? extends Student> c3 = s.getClass();
        System.out.println(c1==c3);
        System.out.println("--------");


       // 使用Class类中的静态方法forName(String className)
        Class<?> c4 = Class.forName("com.itheima_02.Student");
        System.out.println(c1==c4);

四、反射获取成员变量的方法

Class类获取构造方法对象的方法
在这里插入图片描述

Constructor类用于创建对象的方法
在这里插入图片描述

 Class<?> c = Class.forName("com.itheima_02.Student");

        //Constructor<?>[] getConstructors​() 返回一个包含 Constructor对象的数组, Constructor对象反映了由该 Class对象表示的类的所有公共构造函数。
        //Constructor<?>[] cons = c.getConstructors();

        //Constructor<?>[] getDeclaredConstructors​() 返回反映由该 Class对象表示的类声明的所有构造函数的 Constructor对象的数组。
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for(Constructor con :cons){
            System.out.println(con);
        }
        System.out.println("--------");

        //Constructor<T> getConstructor​(Class<?>... parameterTypes) 返回一个 Constructor对象,该对象反映由该 Class对象表示的类的指定公共构造函数。
        //Constructor<T> getDeclaredConstructor​(Class<?>... parameterTypes) 返回一个 Constructor对象,该对象反映由此 Class对象表示的类或接口的指定构造函数。
        //参数:你要获取的构造方法的参数个数和数据类型字节码文件对象
        Constructor<?> con = c.getConstructor();

        //Constructor提供了一个类的单个构造函数的信息和访问权限。
        //T newInstance​(Object... initargs) 使用由此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
        Object obj = con.newInstance();
        System.out.println(obj);

暴力反射



        //暴力反射
        //public void setAccessible​(boolean flag):值为true取消访问检查
        con.setAccessible(true);

        Object obj = con.newInstance("林青霞");
        System.out.println(obj);

五、反射获取成员方法

Class类获取成员方法对象的方法
在这里插入图片描述
Method类用于执行方法的方法
在这里插入图片描述

//获取Class对象
        Class<?> c = Class.forName("com.itheima_02.Student");

        //Method[] getMethods​() 返回一个包含 方法对象的数组, 方法对象反映由该 Class对象表示的类或接口的所有公共方法,包括由类或接口声明的对象以及从超类和超级接口继承的类。
        //Method[] getDeclaredMethods​() 返回一个包含 方法对象的数组, 方法对象反映由 Class对象表示的类或接口的所有声明方法,包括public,protected,default(package)访问和私有方法,但不包括继承方法。
        //Method[] methods = c.getMethods();
        Method[] methods = c.getDeclaredMethods();
        for(Method method :methods){
            System.out.println(method);
        }
        System.out.println("--------");

        //Method getMethod​(String name, Class<?>... parameterTypes) 返回一个 方法对象,该对象反映由该 Class对象表示的类或接口的指定公共成员方法。
        //Method getDeclaredMethod​(String name, Class<?>... parameterTypes) 返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 Class对象。
        Method m = c.getMethod("method1");

        //获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

        //obj.m();

        //在类或接口上提供有关单一方法的信息和访问权限。
        //Object invoke​(Object obj, Object... args) 在具有指定参数的指定对象上调用此 方法对象表示的基础方法
        //Object,返回值类型
        //Obj:调用方法的对象
        //arg;方法需要的参数
        m.invoke(obj);