反射基础入门

1、反射的概念

idea的提示,反射就是可以从类里面获取东西:成员变量,成员方法,构造方法

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

2、获取Class的三种方式 (Class)

1)Class.forName("全类名") 源代码阶段

2)类名.class 加载阶段

3)对象.getClass(); 运行阶段

public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 第一种方式 Class.forName("全类名") Chapter08.Student  最常用
        Class clazz = Class.forName("Chapter08.Student");
        System.out.println(clazz); // class Chapter08.Student
​
        // 第二种方式 类名.class  当成参数进行传递
        Class clazz2 = Student.class;
        System.out.println(clazz2); // class Chapter08.Student
​
        // 第三种方式 对象.getClass() 当有了这个类的对象时,才能够使用
        Student s = new Student();
        Class clazz3 = s.getClass();
        System.out.println(clazz3); // class Chapter08.Student
    }
}

3、获取构造方法 (Constructor)

public class ReflectDemo02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 1. 获取Class对象
        Class clazz = Class.forName("Chapter08.Student");
        // 2. 获取构造方法
        // 获取所有公共构造方法  公共
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
​
        // 获取所有构造方法  公共 + 私有
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : declaredConstructors) {
            System.out.println(constructor);
        }
​
        // 获取单个
        Constructor con = clazz.getDeclaredConstructor();
        System.out.println(con);
        
        Constructor con2 = clazz.getDeclaredConstructor(String.class);
        System.out.println(con2);
​
        Constructor con3 = clazz.getDeclaredConstructor(int.class);
        System.out.println(con3);
​
        Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);
        // 获取修饰符
        int modifiers = con4.getModifiers();
        System.out.println(modifiers);
        // Ctrl+P 可查看能调用的方法
        // Student student = new Student();
        // 获取参数
        Parameter[] parameters = con4.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        // 创建Student对象   临时取消安全检查权限检查:暴力反射
        con4.setAccessible(true);
        Student student = (Student) con4.newInstance("张三", 18);
        System.out.println(student);
    }
}

4、获取成员变量 (File)

// 获取成员变量
public class ReflectDemo03 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class clazz = Class.forName("Chapter08.Student");
        // 获取成员变量
        // getFields 获取public修饰的成员变量
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        // getDeclaredFields 获取所有成员变量
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredFields);
        }
        // 获取 public 指定成员变量
        Field gender = clazz.getField("gender");
        System.out.println(gender);
        // 获取 私有 指定成员变量
        Field name = clazz.getDeclaredField("name");
        System.out.println(name);
​
        // 获取权限修饰符
        int genderMod = gender.getModifiers();
        System.out.println(genderMod);
​
        // 获取成员变量名
        String gn = gender.getName();
        System.out.println(gn);
​
        // 获取数据类型
        Class type = gender.getType();
        System.out.println(type);
​
        // 记录成员变量记录的值
        Student S = new Student("zhangsan",23,"男");
        String value = (String) gender.get(S);
        System.out.println(value);
​
        // 修改成员变量的值
        gender.set(S,"女");
        System.out.println(S);
    }
}

5、获取成员方法 (Method)

// 获取成员方法
public class ReflectDemo04 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        // 获取Class对象
        Class clazz = Class.forName("Chapter08.Student");
        // 获取所有 公共成员方法
        Method[] method = clazz.getMethods();
        for (Method m : method) {
            System.out.println(m);
        }
        // 获取所有成员方法
        Method[] DeclaredMethod = clazz.getDeclaredMethods();
        for (Method dm : DeclaredMethod) {
            System.out.println(dm);
        }
        // 返回单个成员方法
        Method m = clazz.getMethod("setName", String.class);
        // 返回单个私有成员方法
        Method dm = clazz.getDeclaredMethod("setGender", String.class);
        // 获取方法的修饰符
        System.out.println(Modifier.toString(m.getModifiers()));
        // 获取方法的类型
        System.out.println(m.getReturnType());
        //获取方法的参数
        Parameter[] parameters = m.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        // 获取方法的参数类型
        Class[] parameterTypes = m.getParameterTypes();
        for (Class parameterType : parameterTypes) {
            System.out.println(parameterType);
        }
        // 获取到方法的返回值类型
        Class returnType = m.getReturnType();
        System.out.println(returnType);
        // 获取到方法的异常类型
        Class[] exceptionTypes = m.getExceptionTypes();
        for (Class exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }
​
        // 方法运行
        Student student = (Student) clazz.newInstance();
        m.invoke(student, "张三");
        System.out.println(student);
        // 运行私有方法  取消访问权限
        dm.setAccessible(true);
        dm.invoke(student, "男");
        System.out.println(student);
    }
}
  • 19
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值