反射的理解及总结

转载链接:https://www.cnblogs.com/lzq198754/p/5780331.html

一、反射的定义

  在运行状态下,能动态获取一个类的所有属性及方法,能动态调用任意一个对象的任意一个方法和属性。

二、反射机制的相关方法

  1、通过一个对象获取对象的类名和报名:Object.getClass().getName()

  2、动态加载类的三种方式:

    (1)Class.forName(“com.java.Test”)

    (2)new Test().getClass()

    (3)Test.class;

  3、获取一个对象的父类与实现的接口

    (1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类

    (2)TestClass.getSuperClass();  //获取一个对象的父类

    (3)Class(?)[] intes = TestClass.getInterfaces();  //获取一个对象的所有接口

  4、获取某一个类的全部构造函数

    (1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类

    (2)Test test = (Test)TestClass.newInstance();  //第一种方法,实例化默认构造方法

    (3)Constructor<?>[] cons = TestClass.getConstructors();  //第二种方法,获取所有构造方法

    (4)cons[0].getParameterTypes();  //查看构造方法的所有参数

    (5)Test test =  (Test)cons[0].newInstance();  //实例化无参构造方法

  5、获取某个类的全部属性

    (1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类

    (2)Field[] fields = TestClass.getDeclaredFields();  //取得本类全部属性

    (3)Field[] fields1 = TestClass.getFields();  //获取实现的接口或父类的属性

  6、获取某个类的全部方法

    (1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类

    (2)Method[] methods = TestClass.getMethods(); //获取本类所有的方法

  7、通过反射机制调用某个类的方法

    (1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类

    (2)Method method = TestClass.getMethod("test1", String.class) //获取指定方法,test1是方法名称,String.Class是参数类型

    (3)method.invoke(TestClass.newInstance(), "test");  //方法的调用

  8、通过反射机制操作某个类属性

    (1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类

    (2)Object obj = TestClass.newInstance();  //实例化对象

    (3)Field field = TestClass.getDeclaredField("property");  //获取类的“property”字段

    (4)field.setAcdessible(true);  //设置可以访问private权限的字段

    (5)field.set(obj, "zhangsan")  //修改类的属性的值为“zhangsan”

  9、动态代理

    JDK实现动态代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整写法是:

    static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandle h);

    ClassLoader loader:类加载器,例:new Test().getClass().getClassLoader();

    Class<?>[] interfaces:目标对象的接口类型,例:new Test().getClass().getInterfaces();

    InvocationHandle h:事件处理,执行目标对象的方法,会触发事件处理器的方法,会把当前执行目标对象的方法当作参数传入。

三、反射机制的应用

  1、在泛型为Integer的ArrayList中存放一个String类型的对象

    (1)List<Integer> list = new ArrayList<Integer>();  //新建一个泛型是Integer的list集合

    (2)Method method = list.getMethod("add", Object.class);  //获取ArrayLIst集合添加的方法

    (3)method.invoke(list, "zhangsan");  //添加字符串“zhangsan”到泛型是Integer的list集合中

  2、通过反射获取数组类型并修改数组信息

    (1)int[] temp = {1, 2, 3, 4, 5};  //创建一个数组

    (2)Class<?> demo = temp.getClass().getComponentType();  //获取数组类型

    (3)demo.getName();   //获取数组类型名称

    (4)Array.getLength(temp );  //获取数组长度,java反射机制使用的Array类,java.lang.class类在运行时获取数组的相关信息

    (5)Array.get(temp, 0);  //获取数组的第一个元素

    (6)Array.set(temp, 0, 100);  //设置数组的第一个元素是100

   3、通过反射机制修改数组的大小

    (1)int[] temp = {1, 2, 3, 4, 5};  //创建一个数组

    (2)Class<?> arr= temp.getClass().getComponentType();  //获取数组类型

    (3)Object newArr = Array.newInstance(arr, 15);  //通过Array获取一个长度是15数组实例

    (4)int co = Array.getLength(temp);  //获取temp数组的长度

    (5)System.arraycopy(temp, 0, newArr, 0, co);  //复制新数组到通过反射创建的数组

   4、反射机制在工厂模式中的使用

    利用反射机制实现工厂模式,可以在不修改工厂类的情况下添加任意多个子类,但是需要知道包名和类名,这些可以放在配置文件中加载。

posted @   两颗枣  阅读(202)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示