反射入门(小白教程,超级详细)

Posted 小布丁value

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射入门(小白教程,超级详细)相关的知识,希望对你有一定的参考价值。

定义

在这里插入图片描述

获取当前类的Class对像:
1.Class<?> c= People.class;
2.People p = new People();
Class<?> c = p.getClass();
3.Class<?> c = Class.forName(“包路径.People”)

问题来了:不用单例模式怎么在
1.在堆上new 对象
2.调用构造函数呢?
在这里插入图片描述
当然就是我们的反射了:

在这里插入图片描述

构造函数

public class TEST {
    public static void main(String[] args) {
        Class<?> c=People.class;
        try {
            //获取构造函数
            Constructor<?> constructor = c.getDeclaredConstructor(String.class);
            //权限开放
           constructor.setAccessible(true);
            //通过new 调用构造函数
         Object object=    constructor.newInstance("zs");
        } catch (Exception e) {//基类处理异常。不关心的时候
            e.printStackTrace();
        }
    }
}
class  People{
    private  String name;
    private People(String name){
        this.name=name;
    }
 }

说明:

getDeclaerdConsttuctor 获取共有的私有的 所有的构造函数
getConstructor获取共有的构造函数

如果不该默认权限,就会报IlegnalAccessException异常

在这里插入图片描述

  //权限开放
            constructor.setAccessible(true);

问题解决
在这里插入图片描述

方法调用

 //eat方法调用
        //1.获取调用的方法
        c.getMethod("eat",int.class);
   //1.获取调用的方法
         Method method = c.getMethod("eat", int.class);
            //2.通过对象体调用方法
            method.invoke(object,10);

修改属性

public class TEST {
    public static void main(String[] args) throws NoSuchMethodException {
        Class<?> c=People.class;
        try {
            //获取构造函数
            Constructor<?> constructor = c.getDeclaredConstructor(String.class);
            //权限开放
            constructor.setAccessible(true);
            //通过new 调用构造函数
         Object object= constructor.newInstance("zs");
            //eat方法调用
            //1.获取调用的方法
        Method method=  c.getMethod("eat",int.class);
            //2.通过对象体调用方法
           method.invoke(object,10);
           //name ="lisr";进行属性打印。p.name="lisr";println(p.name);
            // 方法1:通过new 调用构造函数
          Object object1 = constructor.newInstance("lisr");
            System.out.println(object1);
            //方法2:
            //获取属性
            Field field = c.getDeclaredField("name");
            //修改权限
            field.setAccessible(true);
            //设置属性
            field.set(object,"lisr");
            System.out.println(field.get(object));
        } catch (Exception e) {//基类处理异常。不关心的时候
            e.printStackTrace();
        }
    }
}
class  People{
    private  String name;
    private People(String name){
        this.name=name;
    }
    public void eat(int a){
        System.out.println("吃饭");
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\\'' +
                '}';
    }
}

在这里插入图片描述

以上是关于反射入门(小白教程,超级详细)的主要内容,如果未能解决你的问题,请参考以下文章

资深黑客教小白如何攻破一个网站!超级详细的教学教程!太牛逼了

python爬虫入门教程(非常详细),超级简单的Python爬虫教程

利用递归实现 两个队列实现一个栈的教程 写的超级详细小白都能看懂!

利用python 数据分析入门,详细教程,教小白快速入门

pycharm安装2021最新详细教程小白入门

小白也能看懂的插件化DroidPlugin原理-- 反射机制和Hook入门