反射的一些基本知识

使用反射操作类成员的前提:

要获得该类字节码文件对象,就是Class对象;

反射的概念:

反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量,成员方法,构造方法),比如知道这类的所有属性和方法并且对于任意一个对象,都能调用它的任意的属性和方法;

如何获取一个类的Class对象

package com.itheima.demo2_Class对象的获取;

public class Student {
    private String name;

    public void method1(){

    }
}
public class Test {
    public static void main(String[] args)throws Exception {
        // 1.方式一:通过	类名.class	获得
        Class<Student> c1 = Student.class;
        System.out.println(c1);
        // 2.方式二:通过对象名.getClass()方法获得
        Student stu = new Student();
        Class<? extends Student> c2 = stu.getClass();
        System.out.println(c2);

        // 3.方式三:通过Class类的静态方法获得: static Class forName("类全名")
        Class<?> c3 = Class.forName("com.itheima.demo2_Class对象的获取.Student");
        System.out.println(c3);

        // 问题:一个类只有一个字节码对象(Class对象)
        System.out.println(c1 == c2);// true
        System.out.println(c1 == c3);// true
    }
}
  • 方式1: 通过类名.class获得
  • 方式2:通过对象名.getClass()方法获得
  • 方式3:通过Class类的静态方法获得: static Class forName(“类全名”)
    • 每一个类的Class对象都只有一个。

Class类常用方法

String getSimpleName(); 获得类名字符串:类名
String getName(); 获得类全名:包名+类名
T newInstance() ; 创建Class对象关联类的对象

public class ReflectDemo02 {
    public static void main(String[] args) throws Exception {
        // 获得Class对象
        Class c = Student.class;
        // 获得类名字符串:类名
        System.out.println(c.getSimpleName());
        // 获得类全名:包名+类名
        System.out.println(c.getName());
        // 创建对象
        Student stu = (Student) c.newInstance();
        System.out.println(stu);
    }
}

反射之操作构造方法

反射之操作构造方法的目的
    * 获得Constructor对象来创建类的对象。

Constructor类概述
    * 类中的每一个构造方法都是一个Constructor类的对象

例如: (列2种,共4种) 
		*1. Constructor getDeclaredConstructor(Class... parameterTypes)
        * 根据参数类型获得对应的Constructor对象
    	* 可以是publicprotected(默认)private修饰符的构造方法。
    	
    	
    	* 2. Constructor[] getDeclaredConstructors()
        *获得类中的所有构造方法对象
    	*可以是publicprotected(默认)private修饰符的构造方法。
Constructor<?>[] conArr2 = Class类.getDeclaredConstructors();

反射之操作成员方法

反射之操作成员方法的目的
    * 操作Method对象来调用成员方法
Method类概述
  * 每一个成员方法都是一个Method类的对象。
例如:(列2种,共4种)     
       *1. Method getDeclaredMethod(String name,Class...args);     
       * 根据方法名和参数类型获得对应的成员方法对象,包括publicprotected(默认)private*2.Method[] getDeclaredMethods();    
       * 获得类中的所有成员方法对象,返回数组,只获得本类的,包括publicprotected(默认)private

反射之操作成员变量


```java
反射之操作成员变量的目的
    * 通过Field对象给对应的成员变量赋值和取值
Field类概述
    * 每一个成员变量都是一个Field类的对象。
例如:(列2种,共4种)
	  *1. Field getDeclaredField(String name);
      * 根据成员变量名获得对应Field对象,包括publicprotected(默认)private*2.Field[] getDeclaredFields();
      * 获得所有的成员变量对应的Field对象,包括publicprotected(默认)private

暴力反射

调用Constructor对象或Method对象方法:
. void setAccessible(true)
   设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值