首页 > 编程语言 >java的反射

java的反射

时间:2023-03-07 09:04:23浏览次数:45  
标签:反射 java String 对象 User class userClass name

1. 获取class对象的三种方式

  • Class.forName();
  • 类名.class
  • 实例对象.getClass();

2. 利用反射获取构造函数

  • Constructor<?>[] getConstructor() 返回所有公共构造方法对象数组

  • Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象数组(包括私有)

  • Constructor<?> getConstructor(...数据类型.class) 返回单个公共构造方法对象

  • Constructor<?> getDeclaredConstructor(...数据类型.class) 返回单个构造方法对象(包括私有)

    (1) Constructor类中用于创建对象的方法

    • T newInstance() 根据指定的构造方法创建对象
    • setAccessible(boolean flag) 设置为true,表示取消访问(私有构造方法)检查
 @Test
 public void f2() throws Exception {
        //通过类名.class加载字节码文件
        Class<User> userClass = User.class;
        //获取private修饰的构造方法
        Constructor<User> contructor = userClass.getDeclaredConstructor(String.class, String.class);
        //设置取消权限检查
        contructor.setAccessible(true);
        //使用该构造方法
        User s = contructor.newInstance("张三","123");
        System.out.println(s);
  }

3. Class类中用于获取成员变量的方法

  1. Field[] getField() 返回所有公共成员变量对象的数组

  2. Field[] getDeclaredFields() 返回所有成员变量对象的数组(包括私有)

  3. Field getField(String name) 返回单个公共成员变量对象

  4. Fidld getDeclaredField(String name) 返回单个成员变量对象

    (1)Field类中用于创建对象的方法

    ​ --void set(Object obj,Object value) 赋值

    ​ --Object get(Object obj) 获取值

@Test
public void f3() throws Exception{
        Class<User> userClass = User.class;
        //获取私有的属性
        Field name = userClass.getDeclaredField("name");
        name.setAccessible(true);
        //获取属性名
        String str = name.getName();
        System.out.println(str);
        //获取访问修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);
        //获取对象的值
        User user = new User(1,"张三","123456");
        String o = (String)name.get(user);
        System.out.println(o);
        //设置对象的值
        name.set(user,"李四");
        System.out.println(user);
    }

4.利用反射获取成员方法

  1. Method[] getMethods() 返回所有公共成员方法对象的数组(包括继承的)

  2. Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承

  3. Method getMethod(String name, ...paramterTypes) 返回单个公共成员方法对象

  4. Method getDeclaredMethod(String name, ...paramterTypes) 返回单个成员方法对象

    (1) Method类中用于创建对象的方法

    ​ --Object invoke(Object obj, Object...args) 运行方法

    ​ 参数一:用obj对象调用该方法

    ​ 参数二:调用方法的传递的参数(没有就不写)

    ​ 返回值:方法的返回值(没有不写)

@Test
public void f4()throws Exception{
        Class<User> userClass = User.class;
        Method abc = userClass.getDeclaredMethod("abc",String.class);
        abc.setAccessible(true);
        String str = (String) abc.invoke(userClass,"李四");
        System.out.println(str);
    }

5.反射的作用

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法。
 @Test
 public void f5()throws Exception{
        //对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去。
        Class<User> userClass = User.class;
        User u = new User(1,"张三","123456");
        Field[] declaredFields = userClass.getDeclaredFields();
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("aaa.txt",true));
        for (Field field:declaredFields) {
            field.setAccessible(true);
            String name = field.getName();
            String value = field.get(u)+"";
            String str = name+"="+value+"\n";
            bos.write(str.getBytes());
        }
        bos.flush();
        bos.close();
    }

标签:反射,java,String,对象,User,class,userClass,name
From: https://www.cnblogs.com/-xyk/p/17185989.html

相关文章

  • ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
    目录ElasticSearch实现分词全文检索-概述ElasticSearch实现分词全文检索-ES、Kibana、IK安装ElasticSearch实现分词全文检索-Restful基本操作ElasticSearch......
  • JavaSE——转型与instanceof关键字
    为什么要转型多态的写法就无法访问子类独有功能了。当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方......
  • java.time
    一、接口1.TemporalAccessor定义了时间类型的基本操作,包括获取数值范围(如月是1-12),获取指定(比如,年,月,日)的值。2.Temporal定义了时间的加减3.TemporalAmount......
  • JavaWeb中文乱码问题
    概述在JavaWeb中通过请求(request)和响应(response)来进行数据传递的过程中,有一个不可避免的问题,即传输的数据中有可能包含中文。当传输的数据中包含中文时,往......
  • Java 基本数据类型变量间运算规则
    在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。转换的方式有两种:自动类型提升和强制类型转换。自动类型提升规则:将取值范围小(......
  • 3_Java并发
    Java并发面试题汇总一.多线程基础1.创建线程的三种方式的对比?采用实现Runnable或Callable接口的方式创建多线程优点:可以继承其他类,并且多个线程可以共享同一个targe......
  • 2_Java集合
    Java集合面试题汇总1.常见的集合有哪些?Java的集合类主要由两个根接口Collection和Map派生出来的。Collection:List:代表有序可重复集合,可直接根据元素的索引来访问Se......
  • 1_JavaSE
    JavaSE面试题汇总1.访问修饰符public、private、protected、以及不写(默认)时的区别?public是所有类可见;protected是同一包内及其所有子类可见;默认是同一包内可见;priva......
  • JavaSE——面向对象三大特征之—多态
    多态的形式多态是继封装、继承之后,面向对象的第三大特性。多态是出现在继承或者实现关系中的。多态体现的格式:父类类型变量名=new子类/实现类构造器;变量名.方法......
  • java部分底层原理了解
    Java内存分配其中在JVM虚拟机中jvm的内存分为五个部分:这个只是在JDK之前的JVM内存图在JDK8开始:取消了方法区,增加了元空间,把原来的方法区的多种功能进行拆分,有的功能......