反射

反射

1.1什么是反射

就是使用类的另一种方式

反射使用类的方式:
要使用反射就需要把一个类的字节码文件加载到内存中,加载到内存中JVM就会为这个字节码文件生成一个class对象,这个class对象就是对这个字节码文件的描述,一个class文件中包含了,构造方法,成员变量,成员方法
在Java语言中万物皆对象所以 ,构造方法,成员变量,成员方法都是对象,
Java也提供了对应的类对其描述:Constructor,Field,Method,获取到对应成员对象就可以调用成员中的方法
反射学习思路
  首先获取一个类的字节码文件
  调用字节码文件对象的方法获取指定成员 Constructor,Field,Method
  调用对应的成员对象的方法使用类中的成员

1.2 获取Class对象

三种方式:
  通过类中静态方法forName()
  通过类的class (例如:Student.class)
 通过对象调用(例如:Student stu = Student(); stu.getClass())

1.3获取构造方法

常用:
 public Constructor getDeclaredConstructor(Class<?>… parameterTypes)
  parameterTypes:表示的是构造方法参数对应的Class类型

        Class c= Class.forName("com.itheima.myreflect3.Student");
        Constructor constructor = c.getDeclaredConstructor(String.class);
        System.out.println(constructor);
1.3.1使用构造方法对象

作用:用来创建对象
Constructor类中的方法
public T newInstance(Object … initargs) // 创建对象
initargs: 表示的就是给构造方法所传递的具体的数据(实际参数)

创建对象
constructor.newInstance()

1.3.2获取成员变量并使用

常用:
public Field getDeclaredField(String name) // name参数表示的就是成员变量的名称
1.获取name成员变量
Field field = clazz.getDeclaredField(“name”);
//强行获取私有属性
field .setAccessible(true);
2.
给成员变量设置值
public void set(Object obj, Object value)
获取成员变量值
public Object get(Object obj)

       Class c = Class.forName("test.Student");
        Constructor constructor = c.getDeclaredConstructor();
        Field ss = c.getDeclaredField("name");
        Field age = c.getDeclaredField("age");
        ss.setAccessible(true);
        age.setAccessible(true);
        Student stu = (Student) constructor.newInstance();
        ss.set(stu,"张三");
        System.out.println(stu);
        Object o = ss.get(stu);
        System.out.println(o);
1.3.3获取成员方法并使用

常用:
public Method getDeclaredMethod(String name, Class<?>… parameterTypes)
name:表示的是成员方法的名称
parameterTypes:表示的就是成员方法参数类型所对应的Class类型
使用方法(调用)
public Object invoke(Object obj, Object… args)

 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//        Object invoke​(Object obj, Object... args):运行方法
//        参数一:用obj对象调用该方法
//        参数二:调用方法的传递的参数(如果没有就不写)
//        返回值:方法的返回值(如果没有就不写)
        //1.获取class对象
        Class clazz = Class.forName("test.Student");
        //2.获取里面的Method对象  function4
        Method method = clazz.getMethod("function4", String.class);

        //3.运行function4方法就可以了
        //3.1创建一个Student对象,当做方法的调用者
        Student student = (Student) clazz.newInstance();

        //3.2运行方法
        Object result = method.invoke(student, "zhangsan");  // 通过student对象调用function4这个方法,将zhangsan作为方法参数传递过去
        //4.打印一下返回值
        System.out.println(result);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值