反射的基本概念
使用反射机制可以动态获取当前class的信息,比如方法的信息,注解信息,方法的参数,属性等。
反射技术应用的场景
(1)JDBC加载驱动连接Class.forName("");
(2)Spring容器框架IOC实例化对象。
(3)自定义注解生效(反射 +Aop)
(4)第三方核心的框架
反射技术的使用
Class类代表类的实体,在运行的java应用程序中表示类和接口。
Field类代表类的成员变量(成员变量也称为类的属性)
Method类 代表类的方法
Constructor类 代表类的构造方法
Class<?> class = Class.forName("类路径“)
我们来玩玩这个方法:
@Data
public class User {private Integer age;private String name;public User(){System.out.println("######=======我是无参构造函数===============#######");}public User(Integer age,String name){System.out.println("######=======我是有参构造函数===============#######");this.age = age;this.name = name;}public String name(String name) {System.out.println("name========######:"+name);return "柳如是";}}
说这个之前我们来讲讲,初始化对象的方式:
第一种通过new的方式去初始化:
User user = new User();
第二种通过反射技术:
Class.forName("类的完整路径地址");
走无参构造函数初始化对象:
Class<?> aClass = Class.forName("ity.User");//newInstance()初始化对象,实际上走的是无参构造函数初始化对象User user = (wInstance();System.out.println("user初始化对象########:"+user);
打印:
走有参构造函数初始化:
Class<?> aClass = Class.forName("ity.User");Constructor<?> constructor = Constructor(Integer.class, String.class);User user = (User) wInstance(22, "懂小宛");System.out.println("走有参构造函数初始化##############:"+user);
对私有对象属性赋值操作:
Class<?> aClass = Class.forName("ity.User");User user = (wInstance();//获取到私有对象属性Field age = DeclaredField("age");age.set(user,22);Field name = DeclaredField("name");name.set(user,"苏小小");System.out.println(user);
执行上面这段代码,会报错:
因为我们是给私有的属性赋值,所以要开放权限,总结下:如果使用反射给私有属性或者调用私有的方做操作,都需要设置权限。
Class<?> aClass = Class.forName("ity.User");User user = (wInstance();//获取到私有对象属性Field age = DeclaredField("age");age.setAccessible(true);age.set(user,22);Field name = DeclaredField("name");name.setAccessible(true);name.set(user,"苏小小");System.out.println(user);
打印:
使用反射机制调用方法:
Class<?> aClass = Class.forName("ity.User");//参数一获是要调用的方法,参数二是方法参数类型Method nameFuncaty = DeclaredMethod("getName", String.class);User user = (User) wInstance();nameFuncaty.invoke(user,"柳如是");
本文发布于:2024-01-29 14:09:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650859115831.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |