java反射大白话

打印 上一主题 下一主题

主题 536|帖子 536|积分 1608

转自:
http://www.java265.com/JavaCourse/202206/3796.html
下文通过笔者的这篇文章,将带你快速入门java反射,如下所示
java反射的概念
  1. JAVA反射机制:
  2.     程序在运行时,可对任意一个实体类,
  3.          对任意一个对象
  4.          都可以调用其中的方法及属性
  5. 我们将这种运行时,获取其属性的功能称之为"java反射"
复制代码
java反射的功效
  1.   
  2. 1、运行时生成对象实例
  3. 2、运行期间调用方法
  4. 3、运行时更改属性
复制代码
Java反射的使用场景
  1. 1、在运行时判断任意一个对象所属的类
  2. 2、在运行时构造任意一个类的对象
  3. 3、在运行时判断任意一个类所具有的方法和属性
  4. 4、在运行时调用任意一个对象的方法
  5. 5、生成动态代理
复制代码
Java反射涉及类

类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量(成员变量也称为类的属性)
Method类代表类的方法
Constructor类代表类的构造方法
例:
  1. User类
  2. public class User {
  3.     private String name;
  4.     private int age;
  5.     private User(String name, int age) {
  6.         this.name = name;
  7.         this.age = age;
  8.     }
  9.     public User(){
  10.         throw new IllegalAccessError("禁止无参构造方法");
  11.     }
  12.     private String getName() {
  13.         return name == null ? "" : name;
  14.     }
  15.     private void setName(String name) {
  16.         this.name = name;
  17.     }
  18.     public int getAge() {
  19.         return age;
  20.     }
  21.     public void setAge(int age) {
  22.         this.age = age;
  23.     }
  24.     @Override
  25.     public String toString() {
  26.         return "User{" +
  27.                 "name='" + name + '\'' +
  28.                 ", age=" + age +
  29.                 '}';
  30.     }
  31. }
  32. import java.lang.reflect.Constructor;
  33. import java.lang.reflect.Field;
  34. import java.lang.reflect.InvocationTargetException;
  35. import java.lang.reflect.Method;
  36. public class TestClass{
  37.     public static void main(String[] args){
  38.         Class<?> clz = null;
  39.         try {
  40.             clz = Class.forName("User");//全路径名
  41.         } catch (ClassNotFoundException e) {
  42.             e.printStackTrace();
  43.         }
  44.         // 找到带有这个参数的构造方法
  45.         Constructor constructor = null;
  46.         try {
  47.             constructor = clz.getDeclaredConstructor(String.class, int.class);
  48.         } catch (NoSuchMethodException e) {
  49.             e.printStackTrace();
  50.         }
  51.         constructor.setAccessible(true);
  52.           // 初始化对象
  53.         Object user = null;
  54.         try {
  55.             user = constructor.newInstance("猫猫",20);
  56.         } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
  57.             e.printStackTrace();
  58.         }
  59.         System.out.println("--------------"+constructor.toString());
  60.        // 找到该私有方法
  61.         Method getName = null;
  62.         try {
  63.             getName = clz.getDeclaredMethod("getName");
  64.         } catch (NoSuchMethodException e) {
  65.             e.printStackTrace();
  66.         }
  67.         getName.setAccessible(true);
  68.         String name = null;
  69.         try {
  70.             name = (String) getName.invoke(user);
  71.         } catch (IllegalAccessException e) {
  72.             e.printStackTrace();
  73.         } catch (InvocationTargetException e) {
  74.             e.printStackTrace();
  75.         }
  76.         System.out.println("--------------"+name);
  77.         // 找到私有属性
  78.         Field age = null;
  79.         try {
  80.             age = clz.getDeclaredField("age");
  81.         } catch (NoSuchFieldException e) {
  82.             e.printStackTrace();
  83.         }
  84.         age.setAccessible(true);
  85.         try {
  86.             age.setInt(user16, 20);   // 修改属性
  87.         } catch (IllegalAccessException e) {
  88.             e.printStackTrace();
  89.         }
  90.         try {
  91.             System.out.println("--------------"+age.get(user));
  92.         } catch (IllegalAccessException e) {
  93.             e.printStackTrace();
  94.         }
  95.     }
  96. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表