java反射基本操作

反射相关方法 

  • 访问类的字段

  • 访问类的方法

  • 访问类的构造器

// 获取到类对象的方式(三种)
User user = new User("lisi","123abc");
Class clazz = user.getClass();// 第一种
Class<?> userClazz = Class.forName("com.example.demo.myenum.User");// 第二种,需要处理异常
Class userClazz1 = User.class;// 第三种

// 获取类的所有字段(私有,公开,默认,受保护)
Field[] fields = clazz.getDeclaredFields();
// 获取指定字段,需要处理异常
Field username = clazz.getDeclaredField("username");
// 获取父类
Class superClass = class.getSuperClass();
// 获取到所有父类的字段
while(superClass != null && superClass != Object.class) {
    Field[] superFields = superClass.getDeclareFields();
    superClass = superClass.getSuperClass();
}

// 访问字段
for(Field field : fields) {
    // 设置访问权限,打开后可以访问私有修饰的字段
    field.setAccessible(ture);
    // 获取到字段名字
    String name = field.getName();
    // 获取字段值
    Object object = field.get(user);
    // 获取字段的类型,当需要判断类型时使用
    Class<?> type = field.getType();
    // 判断字段的访问修饰符
    Modifier.isPrivate(field.getModifiers());
    // 判断字段是否静态
    Modifier.isStatic(field.getModifiers());
    
    // 往字段中set值
    Object o = clazz.getConstructor(String.class, String.class).newInstance();
    field.set(o,"666");
}

// 访问方法
Method[] methods = clazz.getMethods();// 获取所有方法
Method method = clazz.getMethod("test", String.class);// 获取指定方法,参数为方法名,参数类型
// 调用方法
for(Method method1 : methods) {
    method1.setAccessible(true);
    Object o = clazz.getConstructor(String.class, String.class).newInstance();
    method1.invoke(o,"hello world");// 参数
}

// 访问构造器
// 获取所有的public的构造器
Constructor[] constructors = clazz.getConstructors();// 批量
// 获取所有的构造器(四种访问修饰符都可)
Constructor[] constructors1 = clazz.getDeclaredConstructors();
// 获取public的无参构造器
Constructor constrctor = clazz.getConstructor(null);// 指定
// 获取private的有参构造器
Constructor constructor1 = clazz.getDeclaredConstructor(String.class,String.class);// 参数类型要传
// 通过构造器获取对象
Object object = constructor1.newInstance("lisi","1236565");// 使用时要注意类型强转
发布了59 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41010294/article/details/103117150