java知识那么多,怎么学好呢?----记作用、找核心类、突破口

2022-03-09  本文已影响0人  一乐乐

✿ 这里咱以学习内省机制和反射为例

1、学习新知识点----记住作用(先了解是什么、和前面的知识点有什么联系、作用)

(1)先了解什么是反射?【简单理解和比较官方的描述】


(1)先了解什么是内省?


(2)内省机制和反射的联系:

其实内省机制也是通过反射来实现的,而反射是对一切类都适合去动态获取类的信息,而内省机制是sun公司针对特殊的类---javaBean推出的技术。内省机制就是用来获取javabean的信息的。

(3)反射的作用是什么?


(3)内省的作用是什么?


2、学习新知识点----抓住核心类、突破口、见名知意

■ 例如反射的核心类----Class【作用结合见名知意,拥有类有关的一切信息(构造器、方法、字段、内部类、接口、父类等等)

■ 例如内省机制的核心类---Introspector【作用结合见名知意,拥有javaBean有关的一切信息(属性、方法、事件)

2-2、反射---操作构造器(方法、字段是同理可得的)

Class(核心类、学习反射机制的突破口、学习操作构造器的学习入口)---操作g构造器

图片.png 图片.png

✿ 反射机制操作构造器的代码如下:

//类中的构造器可以被外界访问同时没有参数,直接使用Class类的newInstance方法创建对象
Class<Person> clazz = Person.class;
Constructor<Person> con= clazz.getConstructor();
con.newInstance();
System.out.println("========================");

//反射:调用构造器的方法创建对象[无参构造器]
clazz = Person.class;
con= clazz.getConstructor(String.class);
con.newInstance("shan");
System.out.println("========================");

//反射:调用构造器的方法创建对象[无参构造器]
clazz = Person.class;
con= clazz.getDeclaredConstructor(String.class, int.class);
//设置当前的构造器【私有的】可以访问
con.setAccessible(true);
con.newInstance("shan", 10);    

2-2、内省---操作javaBean

Introspector(核心类、学习内省机制的突破口、学习操作javaBean的学习入口)---操作javaBean

图片.png 图片.png 图片.png

✿ 内省机制操作javaBean的属性代码如下:

    @Test
    public void testIntrospector() throws Exception {
        //1、通过突破口(核心类Introspector)获取javaBean描述对象BeanInfo
        BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
        //2、获取javaBean中的属性描述器
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        
        //创建一个Person对象
        Person person = new Person();
        for (PropertyDescriptor pd : pds) {//遍历数组描述器数组
            //3-1、获取当前的属性的属性名
            System.out.println("当前属性的属性名是:" +pd.getName());
            System.out.println("当前属性的getter方法是:" +pd.getReadMethod());
            System.out.println("当前属性的setter方法是:" +pd.getWriteMethod());
            if("name".equals(pd.getName())) {//若当前属性名是name【不能直接使用setName方法,因为反射的时候并不知道是哪个具体的方法】
                Method setter = pd.getWriteMethod();//3-2、获取setter方法
                setter.invoke(person, "shan");//设置当前person对象的name值为shan
            }   
        }
    }


写在后面的话

       如果你觉得一乐的文章给您带来了一些收获,可以给个三连❤️ ,一乐会一如既往地更新有价值的博客。如果文章存在错误,也欢迎大家指出。还有,如果大家有什么好的学习技巧、学习感悟,也非常欢迎大家在评论区一起交流~

最后感谢大家的支持,谢谢~

上一篇 下一篇

猜你喜欢

热点阅读