当前位置: 首页 > news >正文

JAVA基础(三十二)——反射之创建对象

一、目录

  • 创建对象的方式
  • 利用setAccessible操作属性
  • 利用setAccessible操作方法

二、创建对象的方式

  • 方式一:调用类中的public修饰的无参构造器。
    相关方法:newInstance:调用类中的无参构造器,获取对应类的对象。
  • 方式二:调用类中的指定构造器。
    相关方法:
    1. getConstructor(Class…clazz):根据参数列表,获取对应的构造器对象。只获取public的构造器。
    2. getDecalaredConstructor(Class…clazz):根据参数列表,获取对应的构造器对象。获取所有构造器。

Constructor类相关方法:

  • setAccessible:作用是开启和关闭取消访问安全检查,true为关闭,false为开启。
  • newInstance(Object…obj):调用构造器
package com.javareflection;

import java.lang.reflect.Constructor;

public class Person {
    public static void main(String[] args) throws Exception{
        // 1. 先获取User类的Class对象
        Class<?> aClass = Class.forName("com.javareflection.User");

        // 2. 通过无参构造器创建对象实例
        Object o = aClass.newInstance();
        System.out.println(o);

        // 3. 通过public的有参构造器创建对象实例
        Constructor<?> constructor = aClass.getConstructor(String.class);
        Object ton = constructor.newInstance("Ton");
        System.out.println(ton);

        Constructor<?> constructor1 = aClass.getDeclaredConstructor(int.class, String.class);
        constructor1.setAccessible(true);//如果不关闭访问安全检查,那么就不能给它赋值,因为它不是public类型的
        Object wangwu = constructor1.newInstance(30, "wangwu");
        System.out.println(wangwu);

    }
}

class User{
    private int age = 24;
    private String name = "zhangsan";

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    private User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

User{age=24, name='zhangsan'}
User{age=24, name='Ton'}
User{age=30, name='wangwu'}

三、利用setAccessible操作属性

通过反射获取到了类中的除了public类型的属性时,直接操作是不行的,需要关闭访问安全检查再对其进行操作。

package com.javareflection;

import java.lang.reflect.Field;

public class Animal {
    public static void main(String[] args) throws Exception{
        // 1. 获取Money类的Class对象
        Class<?> aClass = Class.forName("com.javareflection.Monkey");
        Object o = aClass.newInstance();
        System.out.println(o);

        // 2. 获取public属性并修改其值
        Field age = aClass.getField("age");
        System.out.println(age.get(o));
        age.set(o, 1000);
        System.out.println(age.get(o));

        // 3. 获取private属性并修改其值
        Field name = aClass.getDeclaredField("name");
        name.setAccessible(true);
        System.out.println(name.get(o));
        name.set(o, "UglyMonkey");
        System.out.println(name.get(o));
    }
}

class Monkey{
    public int age = 500;
    private String name = "monkeyKing";

    @Override
    public String toString() {
        return "Money{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

500
1000
monkeyKing
UglyMonkey

四、利用setAccessible操作方法

package com.javareflection;

import java.lang.reflect.Method;

public class Boss {
    public static void main(String[] args) throws Exception{

        // 1. 获取MyBoss类的Class对象
        Class<?> aClass = Class.forName("com.javareflection.MyBoss");
        Object o = aClass.newInstance();

        // 2. 调用public方法
        Method hi = aClass.getMethod("hi", String.class);
        hi.invoke(o, "this is me");

        // 3.调用非public方法
        Method say = aClass.getDeclaredMethod("say", int.class, String.class, char.class);
        say.setAccessible(true);
        System.out.println(say.invoke(o, 20, "wang", 'F'));
        System.out.println(say.invoke(null, 30, "Li", 'M'));
    }
}

class MyBoss{
    private int age = 40;
    private static String name = "wangwu";

    public MyBoss() {

    }

    private static String say(int n, String s, char c){
        return n + " " + s + " " + c;
    }

    public void hi(String s){
        System.out.println("hi " + s);
    }
}

hi this is me
20 wang F
30 Li M

注:
如果方法或者属性是static的,那么传进入的对象o可以改成null,因为static是属性所有对象的。

相关文章:

  • java优秀毕业生推荐系统ssm
  • Group DETR
  • 设计模式 工厂方法模式
  • 自动控制原理7.3---z变换理论
  • 基于ISO14229协议的安全访问系列_1
  • 自动控制原理7.4---离散系统的数学模型
  • 【ELFK】之zookeeper
  • ALTERA FPGA IPCORE核之FIFO详细教程
  • 【ELK】日志分析系统概述及部署
  • MyBatis一对多查询,MyBatis中resultMap的使用,MyBatis中collection注意事项,MyBatis的级联搜索
  • STC15单片机-RS-485通信
  • 【JAVA-1】JDK、JRE安装及卸载,有手就会!
  • Python 操作MySql数据库(封装、优雅)
  • 《蓝海战略》让你竞争中获得优势
  • RequestMapping注解
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 4个实用的微服务测试策略
  • C# 免费离线人脸识别 2.0 Demo
  • CSS 三角实现
  • css布局,左右固定中间自适应实现
  • css系列之关于字体的事
  • happypack两次报错的问题
  • java2019面试题北京
  • JavaScript-Array类型
  • js ES6 求数组的交集,并集,还有差集
  • js算法-归并排序(merge_sort)
  • js中forEach回调同异步问题
  • leetcode386. Lexicographical Numbers
  • spark本地环境的搭建到运行第一个spark程序
  • Vue.js-Day01
  • Web标准制定过程
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 简单基于spring的redis配置(单机和集群模式)
  • 如何学习JavaEE,项目又该如何做?
  • 使用权重正则化较少模型过拟合
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 用简单代码看卷积组块发展
  • #vue3 实现前端下载excel文件模板功能
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (六)软件测试分工
  • (全注解开发)学习Spring-MVC的第三天
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (已解决)什么是vue导航守卫
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .a文件和.so文件
  • .jks文件(JAVA KeyStore)
  • .net core 控制台应用程序读取配置文件app.config
  • .net MVC中使用angularJs刷新页面数据列表
  • @Async注解的坑,小心
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [20171106]配置客户端连接注意.txt
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]