Java反射有多强?它拥有这五大神奇功能

什么是反射?【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();
Java反射有多强?它拥有这五大神奇功能文章插图
根据class创建对象User user1 = (User) userClass.getDeclaredConstructor().newInstance();属性获取单个属性// 获取单个属性Field oneField = userClass.getDeclaredField("code");// 获取单个公有属性Field onePublicField = userClass.getField("grade");
Java反射有多强?它拥有这五大神奇功能文章插图
获取全部属性// 获取全部属性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;}}