Java学习笔记11

今日内容

  反射   Class   类对象获取方式    什么是反射    API   Field   Method  Constructor      getField 和getDeclearField     父类中的属性     invoke调用方法

创建对象 newInstance     内省   BeanInfo   readMethod  writeMethod

反射

class

有对象之前必须先有类,static来修饰类的属性和方法

在Java中存储了类的内容,这个内容也应该是一个对象

Java中每一个类都有一个内存,这每一块内存都是一个对象

这些对象用来记录定义了这些类当中声明了哪些属性和方法以及构造方式

Java将这类抽象为一个Class类

类对象的获得方法

Class类的对象是不能new的想要获取类的对象

通过类名来获取类对象

Class clazz = EasyClassA.class;

通过对象来获取类对象

clazz = new EasyClassA().getClass();

通过Class方法的forName方法获取

clazz = Class.forName("7.25.src.com.situ.EasyColor");

类的类对象中存储了类中定义的内容  属性、方法、构造方法

什么是反射:

反射:在程序运行期间,可以动态获取类中定义的属性和方法以及构造方法的机制(思想)的实现

反射的核心是Class类,程序中使用的类,每一个都有一个唯一对应的Class对象

反射的API(应用程序接口): Field  Method  Constructor

1. Field

Field类提供了有关类或接口的字段的信息,以及动态访问字段的能力。通过反射,你可以获取一个对象的字段值,也可以设置对象的字段值,即使字段是私有的。

基本用法

获取Field对象:使用Class类的getField(String name)或getDeclaredField(String name)方法。前者用于获取公共字段,后者可以获取所有字段(包括私有字段)。

访问字段值:使用Field对象的get(Object obj)方法。如果字段是私有的,需要先调用setAccessible(true)。

设置字段值:使用Field对象的set(Object obj, Object value)方法。同样,如果字段是私有的,需要先调用setAccessible(true)。 

for (Field fitem : farr) {

            //获取属性的名字

            String fname = fitem.getName();

            //获取该名字该属性在Map中的键值对   属性对应的值

            Object value = values.get(fname);

            //设置属性访问权限

            fitem.setAccessible(true);

            //注入

            fitem.set(t, value);

        }

2. Method

Method类提供了关于类或接口中某个方法的信息和调用此方法的能力。通过反射,你可以调用对象上的方法,即使该方法是私有的。

基本用法

获取Method对象:使用Class类的getMethod(String name, Class<?>... parameterTypes)或getDeclaredMethod(String name, Class<?>... parameterTypes)方法。前者用于获取公共方法,后者可以获取所有方法(包括私有方法)。

调用方法:使用Method对象的invoke(Object obj, Object... args)方法。如果方法是静态的,obj参数应为null。 

//获取类对象

        Class <Easy> c = Easy.class;

        //反射获取方法  Method

        Easy easy =  c.newInstance();

        //获取public方法

        Method ma = c.getMethod("methodA");



        //调用方法  对象.方法名()   面向对象

        //方法 method.invoke(对象)  反射的写法

        ma.invoke(easy);



        Method mb = c.getMethod("methodB",int.class,int.class);

        //easy.methodB(12,34);

        mb.invoke(easy,23,45);

    }

3. Constructor

Constructor类提供了关于类的构造器的信息以及创建类的新实例的能力。

基本用法

获取Constructor对象:使用Class类的getConstructor(Class<?>... parameterTypes)或getDeclaredConstructor(Class<?>... parameterTypes)方法。前者用于获取公共构造器,后者可以获取所有构造器(包括私有构造器)。

创建对象实例:使用Constructor对象的newInstance(Object... initargs)方法(注意:从Java 9开始,newInstance方法已被标记为过时,建议使用Constructor的varHandle调用器或MethodHandles.Lookup)。

//反射获取构造方法

        Class<Easy> c = Easy.class;

//        c.newInstance();//调用的无参构造方法  一般用这个

        //构造方法没有返回值类型

        //获取无参构造方法

        Constructor<Easy> con = c.getConstructor();

        con.newInstance();//是谁的调用谁的

        con=c.getConstructor(String.class);

        con.newInstance("张三");





        //修饰符  使用Modifier的方法判断方法/属性/构造方法的修饰符是什么

        Field f =c.getDeclaredField("test");

        int fmod = f.getModifiers();

        System.out.println(fmod);

        boolean bool = Modifier.isStatic(fmod);

        System.out.println(bool);

反射获取访问权限会破坏类的封装性  通过场景说明,在不同的环境下要使用不同的技术。

内省

通过反射来实现,但不会破坏封装性

//获取BeanInfo

        BeanInfo bi = Introspector.getBeanInfo(c);

        //获取属性的写的方法和读的方法  setter/getter



        PropertyDescriptor[] pds = bi.getPropertyDescriptors();



        System.out.println(Arrays.toString(pds));

        String pName = pds[0].getName();//获取属性的名字

        System.out.println("属性名是:"+pName);

        Method read = pds[0].getReadMethod();//该属性对应属性的getter方法

        Method write = pds[0].getWriteMethod();//该属性对应属性的setter方法



        //obj.setName("张三");//面向对象

        //write.invoke(obj,"张三");//反射

        Easy easy = c.newInstance();

        write.invoke(easy,"张三");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值