首页 > 其他分享 >通过反射访问类中的成员

通过反射访问类中的成员

时间:2023-07-11 13:32:40浏览次数:35  
标签:反射 name System 访问 String println public 类中 out

1、访问属性

a.根据属性名获取Field对象

Field f = clazz对象.getDeclaredField(属性名);

b.暴破:f.setAccessible(true); //f是Field

c.访问

f.set(o,值); //o表示对象

d.注意:如果是静态属性,则set和get中的参数o,可以写成null。

package com.test;
class Student {
    public int age;
    private static String name;
    public Student() { // 构造器
    }
    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    } 
}

package com.test;
public class ReflecAccessProperty {
    public static void main(String[] args) throws Exception {
//      1.得到 Student 类对应的 Class 对象
        Class<?> stuClass = Class.forName("com.test.Student");
//        2.创建对象
        Object o = stuClass.newInstance();
        System.out.println(o.getClass());// o 的运行类型是Student
//        3.使用反射得到 age 属性对象
        Field age = stuClass.getField("age");
        age.set(o, 88);//通过反射来操作属性
        System.out.println(o);
        System.out.println(age.get(o));//返回 age 属性的值
//        4.使用反射操作 name 属性
        Field name = stuClass.getDeclaredField("name");
//        对name进行暴破,可以操作 private 属性
        name.setAccessible(true);
//        name.set(o,"张三丰");
        name.set(null, "秦始皇");//因为name 是 static 属性,因此 o 也可以写成null
        System.out.println(o);
        System.out.println(name.get(o));//获取属性值
        System.out.println(name.get(null));//获取属性值,要求name是static
    } 
}

2、访问方法

a.根据方法名和参数列表获取Method方法对象

Method m = clazz.getDeclaredMethod(方法名,XX.class); //得到本类的所有方法

b.获取对象:Object o = clazz.newInstance();

c.暴破:m.setAccessible(true);

d.访问:Object returnValue = m.invoke(o,实参列表); //o就是对象

e.注意:如果是静态方法,则invoke的参数o,可以写成null。

package com.test;
class Monster {
}
package com.test;
class Boss {
    public int age;
    private static String name;
    public Boss() {//构造器
    }
    public Monster m1() {
        return new Monster();
    }
    private static String say(int n, String s, char c) {//静态方法
        return n + " " + s + " " + c;
    }
    public void hi(String s) {//普通 public 方法
        System.out.println("hi" + s);
    } 
}
package com.test;

public class ReflecAccessMethod {
    public static void main(String[] args) throws Exception {
//        1.得到Boss类对应的Class对象
        Class<?> bossClass = Class.forName("com.test.Boss");
//        2.创建对象
        Object o = bossClass.newInstance();
//        3.调用 public 的hi方法
//        3.1 得到hi方法对象
        Method hi = bossClass.getDeclaredMethod("hi", String.class);
//        3.2 调用
        hi.invoke(o,"我在学Java");
//        4.调用 private static 方法
//        4.1 得到 say 方法对象
        Method say = bossClass.getDeclaredMethod("say", int.class, String.class, char.class);
//        4.2 因为 say 方法是private,所以需要暴破
        say.setAccessible(true);
        System.out.println(say.invoke(o,100,"张三",'男'));
//        4.3 因为say方法是static的,还可以这样调用,可以传入 null
        System.out.println(say.invoke(null,200,"李四",'女'));
//        5.在反射中,如果方法有返回值,统一返回Objec,但是它的运行类型和方法定义的返回类型一致
        Object reVal = say.invoke(null, 300, "王五", '男');
        System.out.println("reVal的运行类型="+reVal.getClass());
    } 
}

标签:反射,name,System,访问,String,println,public,类中,out
From: https://blog.51cto.com/u_11315052/6687763

相关文章

  • 反射操作泛型
    1、Java采用泛型擦除的机制来引入泛型。Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是,一旦编译完成,所有的和泛型有关的类型将全部擦除。2、为了通过反射操作这些类型以迎合实际开发的需要,Java新增ParameterizedType,GenericArrayType、Type......
  • 访问标签强制抽象
     在C++中,我们使用访问标签来定义类的抽象接口。一个类可以包含零个或多个访问标签:使用公共标签定义的成员都可以访问该程序的所有部分。一个类型的数据抽象视图是由它的公共成员来定义的。使用私有标签定义的成员无法访问到使用类的代码。私有部分对使用类型的代码隐藏了实......
  • 8086汇编语言精讲3 :寄存器(内存访问)
    字与字节  数据总线宽度的真谛  8086cpu不支持直接将数据送入段寄存器的操作,而ds就是一个段寄存器,所以只要用其他寄存器来中转数据进去ds中  栈   逆序效果     ......
  • Java 包、访问修饰符
    Java包、访问修饰符1.包包可以理解为创建不同的目录来分别存放类,类似计算机当中文件夹通过包可以让相同的类在不同的目录下使用,防止重名的问题通过包可以很好的管理我们编写的类通过包可以控制访问范围使用idea工具创建包通过”.“可以创建子目录的包在同一目录下......
  • Spring Cloud Gateway 设置全局接口访问日志
    SpringCloudGateway设置全局接口访问日志虽然网关只做转发,但是对于每个转发的请求,我们都希望能够在日志中打印出请求的信息,网上版本很多,踩了很多坑,目前没找到完美的解决方案,最后我这个应该是大成版。希望对大家有用。先贴代码,再说遇到什么坑吧。/***@authorchenzhangx*@d......
  • 虚拟IP绑定公网IP访问
    我们目前的虚拟IP,还不能通过公网的形式进行访问,我们首先,来使用内部的IP进行访问看看效果如下:curl虚拟IP如上图我访问了两次,第一次访问返回的是2222的nginx,第二次访问是1111的nginx,已经实现最开始的架构图当中的效果了。现在要解决的问题就是让我们可以通过公网IP进......
  • 使用WARP,加速网站访问
    https://hostloc.com/thread-1024969-1-1.html1.使用全局模式代理2.直接下载使用3.利用优选工具可以使IPv4直接支持访问ipv6的能力......
  • java通过注解和反射优雅的实现数据脱敏
     数据脱敏是对分为数据库数据脱敏与接口脱敏。其中数据库入库数据脱敏方式我们一般采用对称加密来实现数据脱敏,接口脱敏我们一般用遮罩方式实现数据脱敏比如用“*”占位。本文章主要介绍接口脱敏方式。 1.定义一个自定义注解类importjava.lang.annotation.*;@Target(Elem......
  • 浏览器扩展 service-worker中如何访问http请求
    参考:https://stackoverflow.com/questions/71443428/how-can-i-make-an-http-request-in-the-service-worker-chrome-extensionfetch文档:https://developer.mozilla.org/en-US/docs/Web/API/fetch因为service-worker没有没有运行到普通的环境,普通的node库也用不了,所以需要使用......
  • apache日志切割和保持访问
    日志切割的作用和方式Centos01切换云计算光盘安装apache编译安装优化apache命令生成服务控制文件添加执行权限修改服务控制文件添加到系统服务设置开机自动启动服务修改网站主页切换系统盘生成验证数据库修改apache主配置文件加载基本身份验证功能重启服务日志切割(rotatelogs)登陆一......