Java反射有多强?它拥有这五大神奇功能
什么是反射?【Java反射有多强?它拥有这五大神奇功能】 在Java中 , 对于任意一个运行中的对象 , 可以调用该对象的任意属性和方法;已知一个类 , 可以获取这个类的所有属性和方法 , 这就是反射机制 。
一般情况下 , 根据面向对象封装原则 , Java实体类的属性都是私有的 , 我们不能获取类中的属性 。 但我们可以根据反射 , 获取私有变量、方法、构造器 , 甚至是注解 。
文章插图
如何使用? 在最近的项目开发中 , 有一个需求:将人员档案的80+个字段 , 设置部分为隐私字段 , 比如有权限可以看 , 权限需要动态分配 。
我们不可能写80个if - else , 那么我就使用了Java反射 , 获取人员档案类的所有字段 , 并且将设置隐私字段的值全部set为“无权限访问”
首先一点 , 我们根据类或者对象 , 就可以获取class对象
User user = new User();// 方式一 类获取Class userClass = User.class;// 方式二 对象获取Class userClass2 = user.getClass();// 方式三 静态获取Class userClass3 = forName("zwz.pojo.User");
这个class对象是什么呢?
Java反射的所有内容 , 都是围绕这个class对象展开
类类完整路径String className = userClass.getName();
zwz.pojo.User
包路径String packagePath = userClass.getPackage().getName();
zwz.pojo
类名String simpleClassName = userClass.getSimpleName();
User
获取父类String fatherClassName = userClass.getSuperclass().getSimpleName();
People
获取接口Class[] interfaces = userClass.getInterfaces();
文章插图
根据class创建对象User user1 = (User) userClass.getDeclaredConstructor().newInstance();
属性获取单个属性// 获取单个属性Field oneField = userClass.getDeclaredField("code");// 获取单个公有属性Field onePublicField = userClass.getField("grade");
文章插图
获取全部属性// 获取全部属性Field[] fields = userClass.getDeclaredFields();// 获取全部公有属性Field[] publicFields = userClass.getFields();
for (Field field : fields) {//让我们在用反射时访问私有变量field.setAccessible(true);// 属性名field.getName();// 变量类型field.getType().getName();// 获取对象中该属性的值field.get(user1);// set 对象中该属性的值field.set(user1,"admin");}
方法获取类中单个方法// 获取类中单个方法Method publicMethod = userClass.getMethod("login", String.class, String.class);// 获取类中单个方法Method method =userClass.getDeclaredMethod("login", String.class, String.class);1234
获取类所有方法// 获取类所有公有方法Method[] methods = userClass.getMethods();// 获取类所有方法Method[] publicMethods = userClass.getDeclaredMethods();
调用方法// 对象 参数method.invoke(new User(),"admin","123456");
构造器获取所有构造器// 获取所有公有构造器Constructor[] publicConstructors = userClass.getDeclaredConstructors();// 获取所有构造器Constructor[] constructors = userClass.getConstructors();
单个构造器for (Constructor constructor : constructors) {// 构造器名称 等同类名String name = constructor.getName();// 构造器参数Parameter[] parameters = constructor.getParameters();}
使用构造器实例化对象User user2 = (User) constructors[1].newInstance("admin", "123456", "95.8");
注解获取类的注解Annotation[] annotations = userClass.getDeclaredAnnotations();
获取字段的所有注解Annotation[] anns = userClass.getDeclaredField("code").getAnnotations();
获取字段的单个注解Value annValue = http://kandian.youth.cn/index/userClass.getDeclaredField("code").getAnnotation(Value.class);// 注解不存在返回 nullController annController = userClass.getDeclaredField("code").getAnnotation(Controller.class);
其他代码@Data@AllArgsConstructor@NoArgsConstructorpublic class People {private String name;private int age;public void sayHello(){System.out.println("Hello ZWZ!");}}
@Data@AllArgsConstructor@NoArgsConstructorpublic class User extends People implements LoginMapper {@Value("admin")private String code;@Value("123456")private String password;public String grade;@Overridepublic boolean login(String code,String password){if(code.equals("admin")return true;}System.out.println("code = " + code + "password = " + password + "登入失败");return false;}}
- GB|备货充足要多少有多少,5000mAh+128GB,红米新机首销快速现货
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 垫底|5G用户突破2亿:联通垫底,电信月增700万,中国移动有多少?
- 项目|Yearn帝国正在崛起,有多少DeFi项目开始瑟瑟发抖
- 系列|Redmi Note9系列三剑客来袭,差别到底有多大?该如何选择?
- 加急|古代8百里加急究竟有多快?需要骑马20个小时,速度媲美顺丰快递!
- 低俗|网络上还有多少马保国式闹剧
- S7|vivo S7的6400万有多强?带你感受“神奇动物在哪里”
- 商品|薄利多销有多蠢?拼多多低价包邮,不是靠薄利,实则另有“套路”
- 5G|5G速度到底有多快?用过这些手机你才知道