反射的强大:调用类的私有结构

反射的强大:调用类的私有结构

package com.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test {
    //反射之前对于Person的操作
    public static void main(String[] args) throws Exception {
        Class clazz=Person.class;
        //1.通过反射创建Person类的对象
        Constructor cons = clazz.getConstructor(String.class, int.class);
        Object obj = cons.newInstance("Tom", 12);
        Person p=(Person) obj;
        System.out.println(p.toString());


        //2.通过反射,调用对象指定的属性和方法
        Field age = clazz.getDeclaredField("age");
        age.set(p,10);
        System.out.println(p.toString());

        //3.调用方法
        Method show = clazz.getDeclaredMethod("show");
        show.invoke(p);

        //4.通过反射,可以调用Person类的私有结构的。比如:类的私有方法、私有属性
        //调用私有构造器
        Constructor cons1 = clazz.getDeclaredConstructor(String.class);
        cons1.setAccessible(true);
        Person p1 = (Person) cons1.newInstance("jerry");
        System.out.println(p1);

        //调用私有属性
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"Hanmeimei");
        System.out.println(p1);

        //调用私有方法
        Method showNatios = clazz.getDeclaredMethod("showNatios", String.class);
        showNatios.setAccessible(true);
        String nation= (String) showNatios.invoke(p1,"中国");     //相当于 String nation=p1.showNation("中国");
        System.out.println(nation);

    }
}

疑问:

  • 通过直接new的方式或者反射的方式,都可以调用公共的结构,开发中到底用哪个?

    • 建议用直接new的方式,代码量少
  • 什么时候会使用反射的方式? 反射的特征:动态性

    • 当你不确定到底是否要创造哪个对象的时候
  • 反射机制和封装性是不是矛盾的?如何看待两个技术?

    • 不矛盾,封装性是建议调共有,而反射是能不能调的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值