Java基础笔记(一)——反射

介绍

反射(Reflection)体现了java具有动态语言这一特性!通过反射,我们可以在代码运行的时候改变其内部特征,同时也能获得其参数,比如在开发过程中我们经常会设置一些私有属性,这些属性只有通过类自己暴露get方法才能获得,但是通过反射我们也同样可以获得类的私有属性。

为什么我们要学习反射,其实在我们阅读源码的过程中,我们可以随处都可以看到反射的影子,尤其是反射结合注解来使用的场景,所以了解学习反射对我们编码能力有很大的提升。

反射需要合理应用,比较它会影响程序的一些性能,毕竟直接使用对象和通过反射获得对象是有时间上的差异的。

在学习反射前可以去了解以下类加载过程。

如何通过反射获得Class对象

这边一定要理解,这是获得Class对象!一个程序中一个类只有一个class对象。反射就是我们通过对象来获得类的class对象(class也是一种类,存在于jvm之中),想象一下,一般开发中我们都是通过类来获得一个对象,也就是new,而反射就是通过我们new出来的对象,来获得产生这个对象的类的信息。

Class类常用方法(具体使用可以查看API文档)

方法名称方法说明
forName返回一个class对象
getName返回由 类对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为 String`
getSuperClass返回类表示此所表示的实体(类,接口,基本类型或void)的超类 类
getInterfaces确定由该对象表示的类或接口实现的接口。
getClassLoader返回类的类加载器
getConstructors返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造类对象。
getMothed返回一个 方法对象,它反映此表示的类或接口的指定公共成员方法 类对象。
newInstance创建由此 类对象表示的类的新实例
getDeclaredField(String name)返回一个 Field对象,它反映此表示的类或接口的指定已声明字段 类对象。
getDeclaredFields返回的数组 Field对象反映此表示的类或接口声明的所有字段类对象
getAnnotation返回参数类型的注解,没有返回null
getAnnotations返回此元素上存在的注解

getClass()方法

如果知道了一个类的实例也就是对象,可以通过这个方法获得:

Class.forName(类路径)方法

如果知道一个类的路径,可以通过这个方法

类名.class 方法

如果知道需要获得class对象的具体类,就可以通过这个方式

示例

package com.example.demo.basis.reflection;

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

/**
 * @author: sunzhinan
 * @create: 2020-08-10 22:35
 * @description: 反射测试类
 */
public class TestReflection {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {

        //通过forName方式
        Class<?> studentClass1 = Class.forName("com.example.demo.basis.reflection.Student");

        //通过.class方式
        Class<Student> studentClass2 = Student.class;

        //通过实例对象getClass()
        Student student = new Student();
        Class<? extends Student> studentClass3 = student.getClass();

        System.out.println(studentClass1);
        System.out.println(studentClass2);
        System.out.println(studentClass3);

        /**
         * 一些方法介绍
         */

        //获得一个新的对象
        Student student1 = studentClass2.newInstance();
        System.out.println(student.equals(student1));

        //获得父类型
        Class superclass = studentClass2.getSuperclass();
        System.out.println(superclass);

        //获得构造函数
        Constructor<?>[] constructors = studentClass1.getConstructors();
        for (int i = 0; i < constructors.length; i++) {
            System.out.println(constructors[i]);
        }

        //获得指定方法:还可以通过getDeclaredMethods获得所有方法;getMethods只能获得公共的方法
        Method goSchool = studentClass3.getMethod("goSchool");
        System.out.println(goSchool);
        System.out.println(goSchool.getName());
        System.out.println(goSchool.getParameterTypes().length);

        System.out.println("-----------------");
        //获得属性,getFields只能知道public作用域的方法
        Field[] declaredFields = studentClass3.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            System.out.println(declaredFields[i].getName());
            System.out.println(declaredFields[i].getGenericType().getTypeName());
            System.out.println("++++++++++++++++++++++++");
        }


        //动态创建对象执行方法
        Method goName = studentClass2.getDeclaredMethod("goName", String.class);
        System.out.println("name is : " + student1.getName());
        goName.invoke(student1,"sunzhinan");
        System.out.println("name is : " + student1.getName());

        Field nameField = studentClass2.getDeclaredField("name");

        //默认为false,不能修改私有属性,但是通过设置true,可以设置,需要注意安全问题
        nameField.setAccessible(true);
        nameField.set(student1,"woshishui");
        System.out.println("name is : " + student1.getName());
    }
}

反射的方法很多,具体的还是需要自己通过代码来探索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值