Java反射——壮士留步,你新new的对象喜欢隔壁老王。

感谢这篇博客:https://blog.csdn.net/ju_362204801/article/details/90578678,让我对反射有了新的理解。

写在前面

什么是反射?反射就是就是把Java类中的各个部分(成员变量,方法,构造方法,等),映射成一个个的Java对象,可以进行任意调用。打个贴合文章标题的比方,new一个对象,这个对象就是一个美女,她告诉你她今天传了一件性感内衣,然后啥都没告诉你,这时候你灵光一现使用反射即可了解她穿这件内衣始末!下面会通过代码解释!

了解美女对象穿内衣始末

创建实体类

/**
 * 创建一个美女对象类
 */
public class Beauty {

    /**
     * 对象名字
     */
    public String name;

    /**
     * 对象穿内衣原因
     */
    private String reason;

    /**
     * 内衣大小
     */
    private double size;

    public Beauty() {
        System.err.println("无参构造:穿内衣");
    }

    public Beauty(String name, String reason, double size) {
        this.name = name;
        this.reason = reason;
        this.size = size;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name=name;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public double getSize() {
        return size;
    }

    public void setSize(double size) {
        this.size = size;
    }
}

1.无参构造:

public class Test {

    public static void main(String[] args) throws Exception {
        //传统创建一个对象
        Beauty customer = new Beauty();

        //利用反射创建一个对象
        Class clazz = Class.forName(customer.getClass().getName());
        //调用无参构造
        clazz.getConstructor(null).newInstance(null);

    }
}

从写法上来,好像下边的要麻烦一些。运行结果:

 2.有参构造:

        //调用Customer的有参构造
        Beauty customer1 = new Beauty("佟丽娅","穿内衣给我老公看",36d);
        System.out.println(customer1.getName());

        //利用反射调用有参构造
        customer = (Beauty)clazz.getConstructor(String.class,String.class,double.class).newInstance("高圆圆","穿内衣给我老公看",36d);
        System.out.println(customer.getName());

都是穿内衣给他老公看。还是反射麻烦些。

 

 3.获取属性值:

为了更好的区分,此时需要在美女类加一个私有属性。

    public String love1 = "陈思诚";

    private String love2 = "赵又廷";
  //传统获取属性值,获取不到2
  System.out.println("让我看看她们在想谁");
  System.err.println(customer1.love1);

  //暴力获取私有属性
  Field love2 = clazz.getDeclaredField("love2");
  love2.setAccessible(true);
  System.err.println(""+love2.get(customer));

利用反射暴力获取值,发现他俩想的都不是你!!! 

4.给属性赋值

让俩美女都想你!

        //赋值
        customer1.love1="我自己";
        System.err.println(customer1.love1);
     
        Field f = clazz.getDeclaredField("love2");
        f.setAccessible(true);
        f.set(customer,"我自己");
        System.err.println(""+f.get(customer));

 开心吗?都是你了!

5.调用方法

        //调用get,set方法
        customer.setName("佟丽娅");
        System.err.println(customer.getName());
        
        //反射调用set方法
        Method clazzMethod = clazz.getMethod("setName", String.class);
        clazzMethod.invoke(customer,"高圆圆");
        //反射调用get方法
        Method m = clazz.getMethod("getName", null);
        String returnValue = (String)m.invoke(customer, null);
        System.err.println(returnValue);

此处情况众多,请参考文章https://blog.csdn.net/ju_362204801/article/details/90578678,按需分析情况。

为了更好的贴合主题,举例一种!

6.贴合主题的例子

在美女对象中加入

    private void getStr(String[] name,int password){
        for (int i=0 ;i<name.length;i++){
            if (password==123456) {
                System.err.println(name[i] + ":其实我真正爱的是隔壁老王");
            }else{
                System.err.println("密码输入错误,你看不到我心里的想法");
            }
        }
    }

私有方法,传统方式没法子调用。

        Method m = clazz.getDeclaredMethod("getStr", String[].class,int.class);
        m.setAccessible(true);
        m.invoke(customer, (Object)new String[]{"佟丽娅","高圆圆"},123456);

看到这里你可能已经流泪了!那么接下来就是更流泪的事。

        //获得对象的所有属性
        Field fields[]=clazz.getDeclaredFields();

        for (int i=0; i<fields.length;i++){
            Field field=fields[i];
            String fieldName=field.getName();
            System.out.println("具体属性参数:"+fieldName);
        }
        //获得对象的所有方法
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (int i=0; i<declaredMethods.length;i++){
            Method methods = declaredMethods[i];
            String methodName=methods.getName();

            System.out.println("所有方法名称:"+methodName);
        }

这就好比你的女朋友心里想的不仅不是你,而且她穿的什么颜色的内衣已经他们嘿嘿嘿的方式,都应经被你知道了,你现在是不是觉得头上有点奇怪的东西!

加入我们

如果有需要,欢迎可以加入我们的QQ群!(QQ搜索 1074281704, 加入我们的QQ群吧!)
有任何问题,也可以加入我们的QQ群,欢迎交(che)流(dan)!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

答 案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值