JAVA30天-高级篇-7-反射

【Spring】Spring 实例化前后干预接口 InstantiationAwareBeanPostProcessor InstantiationAwareBeanPostProcessor接口是Spring框架中的一个扩展接口,用于在Bean实例化过程中进行自定义处理。该接口定义了多个回调方法,可以在Bean实例化的不同阶段进行干预和定制。它的主要作用是在Bean实例化过程中提供额外的扩展点,允许开发者在Bean实例化前后执行特定的逻辑。 阅读详情

Java反射机制概述

概念

在这里插入图片描述

反射相关的主要API

* java.lang.Class:代表一个类
* java.lang.reflect.Method:代表类的方法
* java.lang.reflect.Field:代表类的成员变量
* java.lang.reflect.Constructor:代表类的构造器

基本使用

// 反射操作
    @Test
    public void test1() throws Exception {
        Class clas = Person.class; // 禁止class作为变量名

        //1.通过反射,创建Person类的对象
        Constructor constructor = clas.getConstructor(String.class, int.class);
        Object obj = constructor.newInstance("Tom", 12);
        Person person = (Person)obj;
        System.out.println(person); // Person{name='Tom', age=12}

        //2.通过反射,调用对象指定的属性、方法
        // 调用属性
        Field age = clas.getDeclaredField("age");
        age.set(person,30);
        System.out.println(person); // Person{name='Tom', age=30}
        // 调用方法
        Method show = clas.getDeclaredMethod("show");
        show.invoke(person); // 你好,xxxx

        System.out.println("*******************************");

        //通过反射,可以调用Person类的私有结构的。比如:私有的构造器、方法、属性
        //调用私有的构造器
        Constructor constructor1 = clas.getDeclaredConstructor(String.class);
        constructor1.setAccessible(true);
        Object obj1 = constructor1.newInstance("jack");
        Person person1 = (Person)obj1;
        System.out.println(person1); // Person{name='jack', age=0}
        //调用私有的属性
        Field name = clas.getDeclaredField("name");
        name.setAccessible(true);
        name.set(person1,"jacklove");
        System.out.println(person1); // Person{name='jacklove', age=0}
        //调用私有的方法
        Method showNation = clas.getDeclaredMethod("showNation", String.class);
        showNation.setAccessible(true);
        showNation.invoke(person1,"中华"); // 我的国籍是:中华

    }

理解Class类并获取Class实例

关于java.lang.Class类的理解

* 类的加载过程:
    程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。
    接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。
    此过程就称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。
    
* 换句话说,Class的实例就对应着一个运行时类。
* 加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式来获取此运行时类。
* Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象

获取Class类的实例(四种方法)

    //获取Class的实例的方式(前三种方式需要掌握)
    @Test
    public void test3() throws ClassNotFoundException {
        //方式一:调用运行时类的属性:.class
        Class clas1 = Person.class;
        
        //方式二:通过运行时类的对象,调用getClass()
        Class clas2 = (new Person()).getClass();

        //方式三:调用Class的静态方法:forName(String classPath)
        Class<?> clas3 = Class.forName("reflection_zgc.Person");

        //方式四:使用类的加载器:ClassLoader  (了解)
        ClassLoader classLoader = Person.class.getClassLoader();
        Class clas4 = classLoader.loadClass("reflection_zgc.Person");

        System.out.println(clas1); // class reflection_zgc.Person
        System.out.println(clas1 == clas2); // true
        System.out.println(clas1 == clas3); // true
        System.out.println(clas1 == clas4); // true
    }

类的加载与ClassLoader的理解

目录:https://blog.youkuaiyun.com/admin741admin/article/details/109146291
具体:https://blog.youkuaiyun.com/admin741admin/article/details/107944341

使用ClassLoader加载配置文件

    @Test
    public void test1() throws IOException {
        //读取配置文件的方式一:
        //此时的文件默认在当前的module下。
//        Properties properties =  new Properties();
//        FileInputStream fis = new FileInputStream("jdbc1.properties");
//        properties.load(fis);


//        //读取配置文件的方式二:使用ClassLoader
        //配置文件默认识别为:当前module的src下
        Properties properties =  new Properties();
        ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("jdbc1.properties");
        properties.load(resourceAsStream);

        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        System.out.println("user = " + user + ",password = " + password);
    }

中文乱码

在这里插入图片描述

创建运行时类的对象

无参构造


        /*
        newInstance():调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。

        要想此方法正常的创建运行时类的对象,要求:
        1.运行时类必须提供空参的构造器
        2.空参的构造器的访问权限得够。通常,设置为public。


        在javabean中要求提供一个public的空参构造器。原因:
        1.便于通过反射,创建运行时类的对象
        2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器

         */
        Class<Person> clazz = Person.class;
        Person obj = clazz.newInstance();
        System.out.println(obj);

有参构造

//1.根据全类名获取对应的Class对象
String name = “atguigu.java.Person";
Class clazz = null;
clazz = Class.forName(name);
//2.调用指定参数结构的构造器,生成Constructor的实例
Constructor con = clazz.getConstructor(String.class,Integer.class);
//3.通过Constructor的实例创建对应类的对象,并初始化类属性
Person p2 = (Person) con.newInstance("Peter",20);
System.out.println(p2);

获取运行时类的完整结构-了解

/*
    获取构造器结构

     */
    @Test
    public void test1(){

        Class clazz = Person.class;
        //getConstructors():获取当前运行时类中声明为public的构造器
        Constructor[] constructors = clazz.getConstructors();
        for(Constructor c : constructors){
            System.out.println(c);
        }

        System.out.println();
        //getDeclaredConstructors():获取当前运行时类中声明的所有的构造器
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for(Constructor c : declaredConstructors){
            System.out.println(c);
        }

    }

    /*
    获取运行时类的父类

     */
    @Test
    public void test2(){
        Class clazz = Person.class;

        Class superclass = clazz.getSuperclass();
        System.out.println(superclass);
    }

    /*
    获取运行时类的带泛型的父类

     */
    @Test
    public void test3(){
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        System.out.println(genericSuperclass);
    }

    /*
    获取运行时类的带泛型的父类的泛型


    代码:逻辑性代码  vs 功能性代码
     */
    @Test
    public void test4(){
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;
        //获取泛型类型
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
//        System.out.println(actualTypeArguments[0].getTypeName());
        System.out.println(((Class)actualTypeArguments[0]).getName());
    }

    /*
    获取运行时类实现的接口
     */
    @Test
    public void test5(){
        Class clazz = Person.class;

        Class[] interfaces = clazz.getInterfaces();
        for(Class c : interfaces){
            System.out.println(c);
        }

        System.out.println();
        //获取运行时类的父类实现的接口
        Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
        for(Class c : interfaces1){
            System.out.println(c);
        }

    }
    /*
        获取运行时类所在的包

     */
    @Test
    public void test6(){
        Class clazz = Person.class;

        Package pack = clazz.getPackage();
        System.out.println(pack);
    }

    /*
        获取运行时类声明的注解

     */
    @Test
    public void test7(){
        Class clazz = Person.class;

        Annotation[] annotations = clazz.getAnnotations();
        for(Annotation annos : annotations){
            System.out.println(annos);
        }
    }
 /**
     * 获取运行时类的方法结构
     */
    @Test
    public void test1(){

        Class clazz = Person.class;

        //getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
        Method[] methods = clazz.getMethods();
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println();
        //getDeclaredMethods():获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            System.out.println(m);
        }
    }

    /*
    @Xxxx
    权限修饰符  返回值类型  方法名(参数类型1 形参名1,...) throws XxxException{}
     */
    @Test
    public void test2(){
        Class clazz = Person.class;
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            //1.获取方法声明的注解
            Annotation[] annos = m.getAnnotations();
            for(Annotation a : annos){
                System.out.println(a);
            }

            //2.权限修饰符
            System.out.print(Modifier.toString(m.getModifiers()) + "\t");

            //3.返回值类型
            System.out.print(m.getReturnType().getName() + "\t");

            //4.方法名
            System.out.print(m.getName());
            System.out.print("(");
            //5.形参列表
            Class[] parameterTypes = m.getParameterTypes();
            if(!(parameterTypes == null && parameterTypes.length == 0)){
                for(int i = 0;i < parameterTypes.length;i++){

                    if(i == parameterTypes.length - 1){
                        System.out.print(parameterTypes[i].getName() + " args_" + i);
                        break;
                    }

                    System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
                }
            }

            System.out.print(")");

            //6.抛出的异常
            Class[] exceptionTypes = m.getExceptionTypes();
            if(exceptionTypes.length > 0){
                System.out.print("throws ");
                for(int i = 0;i < exceptionTypes.length;i++){
                    if(i == exceptionTypes.length - 1){
                        System.out.print(exceptionTypes[i].getName());
                        break;
                    }

                    System.out.print(exceptionTypes[i].getName() + ",");
                }
            }


            System.out.println();
        }



    }
/**
     * 获取当前运行时类的属性结构
     */
    @Test
    public void test1(){

        Class clazz = Person.class;

        //获取属性结构
        //getFields():获取当前运行时类及其父类中声明为public访问权限的属性
        Field[] fields = clazz.getFields();
        for(Field f : fields){
            System.out.println(f);
        }
        System.out.println();

        //getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field f : declaredFields){
            System.out.println(f);
        }
    }

    //权限修饰符  数据类型 变量名
    @Test
    public void test2(){
        Class clazz = Person.class;
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field f : declaredFields){
            //1.权限修饰符
            int modifier = f.getModifiers();
            System.out.print(Modifier.toString(modifier) + "\t");

            //2.数据类型
            Class type = f.getType();
            System.out.print(type.getName() + "\t");

            //3.变量名
            String fName = f.getName();
            System.out.print(fName);

            System.out.println();
        }


    }

调用运行时类的指定结构-掌握

getField和getDeclaredField区别:前者要求运行时类中属性声明为public,后者没限制
setAccessible,保证当前属性/方法/构造器是可访问的,一般用于配合getDeclaredxxx使用

/*

        不需要掌握
     */
    @Test
    public void testField() throws Exception {
        Class clazz = Person.class;

        //创建运行时类的对象
        Person p = (Person) clazz.newInstance();


        //获取指定的属性:要求运行时类中属性声明为public
        //通常不采用此方法
        Field id = clazz.getField("id");

        /*
        设置当前属性的值

        set():参数1:指明设置哪个对象的属性   参数2:将此属性值设置为多少
         */

        id.set(p,1001);

        /*
        获取当前属性的值
        get():参数1:获取哪个对象的当前属性值
         */
        int pId = (int) id.get(p);
        System.out.println(pId);


    }
    /*
    如何操作运行时类中的指定的属性 -- 需要掌握
     */
    @Test
    public void testField1() throws Exception {
        Class clazz = Person.class;

        //创建运行时类的对象
        Person p = (Person) clazz.newInstance();

        //1. getDeclaredField(String fieldName):获取运行时类中指定变量名的属性
        Field name = clazz.getDeclaredField("name");

        //2.保证当前属性是可访问的
        name.setAccessible(true);
        //3.获取、设置指定对象的此属性值
        name.set(p,"Tom");

        System.out.println(name.get(p));
    }

    /*
    如何操作运行时类中的指定的方法 -- 需要掌握
     */
    @Test
    public void testMethod() throws Exception {

        Class clazz = Person.class;

        //创建运行时类的对象
        Person p = (Person) clazz.newInstance();

        /*
        1.获取指定的某个方法
        getDeclaredMethod():参数1 :指明获取的方法的名称  参数2:指明获取的方法的形参列表
         */
        Method show = clazz.getDeclaredMethod("show", String.class);
        //2.保证当前方法是可访问的
        show.setAccessible(true);

        /*
        3. 调用方法的invoke():参数1:方法的调用者  参数2:给方法形参赋值的实参
        invoke()的返回值即为对应类中调用的方法的返回值。
         */
        Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN");
        System.out.println(returnValue);

        System.out.println("*************如何调用静态方法*****************");

        // private static void showDesc()

        Method showDesc = clazz.getDeclaredMethod("showDesc");
        showDesc.setAccessible(true);
        //如果调用的运行时类中的方法没有返回值,则此invoke()返回null
//        Object returnVal = showDesc.invoke(null);
        Object returnVal = showDesc.invoke(Person.class);
        System.out.println(returnVal);//null

    }

    /*
    如何调用运行时类中的指定的构造器
     */
    @Test
    public void testConstructor() throws Exception {
        Class clazz = Person.class;

        //private Person(String name)
        /*
        1.获取指定的构造器
        getDeclaredConstructor():参数:指明构造器的参数列表
         */

        Constructor constructor = clazz.getDeclaredConstructor(String.class);

        //2.保证此构造器是可访问的
        constructor.setAccessible(true);

        //3.调用此构造器创建运行时类的对象
        Person per = (Person) constructor.newInstance("Tom");
        System.out.println(per);

    }

反射的应用:动态代理

静态代理举例

// 统一接口
interface ClothFactory{
    void produceCloth();
}

//代理类
class ProxyClothFactory implements ClothFactory{
    private ClothFactory clothFactory;

    public ProxyClothFactory(ClothFactory clothFactory){
        this.clothFactory = clothFactory;
    }

    @Override
    public void produceCloth() {
        System.out.println("代理做的事情1");
        this.clothFactory.produceCloth();
        System.out.println("代理做的事情2");
    }
}

// 被代理类
class NikeClothFactory implements ClothFactory{

    @Override
    public void produceCloth() {
        System.out.println("nike的产品");
    }
}

public class StaticProxyTest {
    public static void main(String[] args) {
        ClothFactory clothFactory  = new NikeClothFactory();
        ProxyClothFactory proxyClothFactory = new ProxyClothFactory(clothFactory);
        proxyClothFactory.produceCloth();
        // 代理做的事情1
        //nike的产品
        //代理做的事情2
    }
}

动态代理举例+AOP

// 统一接口
interface Human{

    String getBelief();

    void eat(String food);
}

//被代理类
class SuperMan implements Human{

    @Override
    public String getBelief() {
        return "SuperMan的getBelief方法调用";
    }

    @Override
    public void eat(String food) {
        System.out.println("我在吃" + food);
    }
}

// 生成代理对象1
class ProxyFactory{
    // 调用此方法,返回一个代理类的对象。
    public static Object getProxyInstance(Object object) {
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
        myInvocationHandler.bind(object);
        // ClassLoader loader, Class<?>[] interfaces, InvocationHandler h
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),myInvocationHandler);
    }
}

// 生成对象2
class MyInvocationHandler implements InvocationHandler{
    private Object obj;
    public void bind(Object obj){
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // Aop
        AopUtil aopUtil = new AopUtil();
        aopUtil.method1();

        // method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法
        // obj:被代理类的对象
        Object invoke = method.invoke(this.obj, args);

        aopUtil.method2();
        return invoke;
    }
}


class AopUtil{

    public void method1(){
        System.out.println("====================通用方法一====================");

    }

    public void method2(){
        System.out.println("====================通用方法二====================");
    }

}

public class ProxyTest {
    public static void main(String[] args) {
        SuperMan superMan = new SuperMan();
        // 生成代理对象
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);

        String belief = proxyInstance.getBelief();
        System.out.println(belief);
        proxyInstance.eat("龙虾");


        System.out.println("**********************************");
        NikeClothFactory nikeClothFactory = new NikeClothFactory();
        ClothFactory proxyInstance1 = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);
        proxyInstance1.produceCloth();
    
        // ====================通用方法一====================
        //====================通用方法二====================
        //SuperMan的getBelief方法调用
        //====================通用方法一====================
        //我在吃龙虾
        //====================通用方法二====================
        //**********************************
        //====================通用方法一====================
        //nike的产品
        //====================通用方法二====================
    }
}
从Peer到脉冲地震波:免费Python工具全流程配置教程(PyCharm+Anaconda) 本文详细介绍了如何使用Python工具链(PyCharm+Anaconda)实现从Peer数据库获取地震波数据到生成脉冲地震波的全流程配置。通过开源工具EQTOOL和PySeismicGen,结合Python环境搭建、数据格式转换和脉冲地震动生成技术,为结构抗震分析提供高效、灵活的解决方案。 阅读详情

相关推荐

固定翼飞行器建模(二)——MATLAB/Simulink建模、配平及线性化

MATLAB/Simulink固定翼建模、配平及线性化。

2302_80148937的博客 1万+

十二、Java反射机制

      一、反射机制概述       反射机制允许程序在执行期间借助于ReflectionAPI取得任何类的内部信息,并能够直接操作任意对象的内部属性和方法。       下面建立一个Person类。类里有私有的属性和方法,通过反射在Person类外部调用这些私有属性和方法。 public class Person {

陈大大的博客 212

Tessy单元测试软件安装与破解避坑指南(附个人使用路径设置详解)

本文详细介绍了Tessy单元测试软件的安装与配置全流程,包括系统需求、服务器连接设置、环境变量配置等关键步骤,帮助开发者避开常见陷阱。特别提供了个人使用路径设置详解,确保Tessy在嵌入式开发环境中高效运行,适用于汽车电子、工业控制等领域。

weixin_33709364的博客 342

Spring之Bean后处理器——InstantiationAwareBeanPostProcessor的使用与源码解析

文章目录InstantiationAwareBeanPostProcessor介绍InstantiationAwareBeanPostProcessor执行流程InstantiationAwareBeanPostProcessor使用BookPenBookProxyInstantiationAwareBeanPostProcessormain全量代码执行结果源码解析`org.springframework.beans.factory.support.AbstractAutowireCapableBeanFa

白杨 2232

opencv实践项目-图片拼接之缝合线算法

opencv 图片缝合线算法

wyw0000的博客 2623

MODTRAN5.2.1安装配置

MODTRAN5.2.1安装配置

Home 4250

Spring之InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,该接口的作用是感知Bean实例化的处理器。 该接口除了继承自父接口的两个方法外,还定义了三个方法 方法 描述 postProcessBeforeInstantiation 自身方法,是最先执行的方法,它在目标对象实例化之前调用,方法到的返回值是Object类型,我们可...

JustinNeil的博客 2268

端到端自动驾驶:特斯拉FSD Beta技术拆解

端到端自动驾驶:特斯拉FSD Beta技术拆解 ,人工智能,计算机视觉,大模型,AI,这篇文章围绕特斯拉FSD Beta的端到端自动驾驶技术展开,先介绍端到端自动驾驶的定义、与传统方案的区别及FSD Beta的特点,再阐述其硬件基础、技术架构,解析关键技术,还涉及训练数据与标注、安全与冗余设计、实际应用场景与挑战以及技术迭代与更新等内容,展现了该技术的多方面情况。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

Springboot扩展点系列_InstantiationAwareBeanPostProcessor

最后一步内容很长,不过很简单,即按第二步分成的三类,依次注册,具体的顺序是:1:实现PriorityOrdered接口BeanPostProcessor接口的实现类、2:实现实现Ordered接口BeanPostProcessor接口的实现类、3:其他的BeanPostProcessor接口的实现类,其中MyInstantiationAwareBeanPostProcessor属于第三类;(lambda表达式的应用在Spirng的源码中应用很广泛,所以对这块不太熟悉的小伙伴可以着重研究一下)

皮球 888

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2329

C# 工业视觉性能极致优化:多线程推理池 + 对象复用 + 批量检测,速度提升 10 倍实战

set;} // 输入图像set;} // 异步返回结果set;} // 用于监控延迟性能优化不是魔法,而是对资源生命周期的精细管理和对硬件特性的充分利用。多线程池解决了 CPU/GPU 闲置问题。对象池解决了 GC 停顿问题。零拷贝解决了总线带宽瓶颈。严格的 Dispose解决了内存泄漏问题。这套架构已在多个高速锂电、3C 电子检测产线落地,轻松应对 200ms 甚至 50ms 的严苛节拍。记住,在工业领域,稳定性与速度同等重要。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 300

30天 Java 基础学习路线

30天 Java 基础学习路线

大今野 926

AutosarMCAL开发——基于EB CRC驱动

本文为博主个人理解总结记录,如有不正,欢迎指正。

qq_45583706的博客 1387

Java30天养成计划 || 15 快速上手Java枚举和反射

小白专属的《Java30天养成计划》,让你快速上手Java编程。

冰冻三尺,非一日之寒 738

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java SE 30天入门

Java SE 30天入门 这篇博客是为了将之前的篇目整合,便于查阅。也是为了纪念花费45天将715p共计150小时的视频看完的后的笔记成果。 名称 地址 2020最新版Java学习路线视频(含资源,实时更新) https://blog.youkuaiyun.com/m0_46153949/article/details/105239624 Java学习路线:day1 Java语言概述 https://blog.youkuaiyun.com/m0_46153949/article/details/10540

杨丙寅 6680

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java的学习计划30天

  java的学习计划30天一、     基础学习(11天)《java学习笔记》目录:第1章 了解Java 第2章 入门准备 第3章 语法入门 第4章 从autoboxing和unboxing认识对象 第5章 数组 第6章 字符串第7章 封装 第8章 继承和多态 第9章 管理类文件 第10章 异常处理 第11章 枚举类型 第12章 泛型                       

xiaxia0083的专栏 1006

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入理解Java反射

深入理解Java反射

qq_48817343的博客 1137

Java高级篇(四)——反射

  之前写到了设计模式的代理模式,因为下一篇动态代理等内容需要用到反射的知识,所以在之前Java篇的基础上再写一篇有关反射的内容,还是以实际的程序为主,了解反射是做什么的、应该怎么用。 一、什么是反射   反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信...

weixin_34364135的博客 127

java反射经典题目_java反射 练习题

为了回忆起来,于是重新找了几道练习题做了下package cn.incast.homework30;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflec...

weixin_42501331的博客 1151

JAVA高级特性反射和注解

反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相关的语义。 反射操作核心的概念“一切的操作都将使用Object完成, 类、 数组的引用都可以使用Object进行接收” 实例化类对象的方式。...

weixin_30662109的博客 131

【韩顺平老师Java反射笔记】

1.反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息(化比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射。//得到本类的所有方法。2.加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),[说明:默认修饰符是0,public是1,private是2,protected是4,[说明:默认修饰符是0,public是1,private是2,protected是4,

西洼工作室的博客 1077

Java修炼之反射 2024.7.30 15:13

Java 反射(Reflection)是一种强大且灵活的机制,允许程序在运行时检查和操作类、接口、字段和方法等高级结构。它使开发者可以动态地获取对象的信息,甚至可以在运行时创建新的类实例、调用方法和改变属性。反射是 Java 提供的一个API,可以对 Java 类的组成部分进行观察和操作类的名称类的方法类的字段(属性)类的构造函数修饰符(如publicprivate等)Java 的反射机制是一种强大的工具,可以在运行时动态操作对象及其成员。

2301_80011650的博客 580

北京JAVA基础面试30天打卡01

本文总结了Java核心面试题中的三个重要知识点:1)接口与抽象类的区别,从定义、继承方式、成员变量、方法等方面进行对比;2)JDK动态代理与CGLIB动态代理的差异,包括实现方式、性能表现及适用场景;3)Java反射机制的原理与应用,详细介绍了获取Class对象、操作构造器/方法/字段的方法,并分析了反射在框架开发中的实际应用场景及其优缺点。这些知识点涵盖了Java语言特性、设计模式及底层机制,是面试中常考的核心内容。

qq_44333770的博客 916

java高级反射_反射---Java高级开发必须懂的

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。一、Class类的使用1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为java.lang.Class类的构造方法...

weixin_42138703的博客 183

java高级必须懂得_反射---Java高级开发必须懂的

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。一、Class类的使用1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为java.lang.Class类的构造方法...

weixin_39777242的博客 96

Java基础反射

本篇博文主要总结Java中的反射技术。

孤夜的博客 1045
上一篇: JAVA30天-高级篇-5-泛型
下一篇: JAVA30天-高级篇-8-新特性
zgcadmin
博客等级 码龄9年 174粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值