[Java基础] 反射

一:反射

  就是从klass里找到该类对象在Class的映像,相关方法有:

复制代码
public static void main(String[] args) throws Exception {
        //获取字节码文件
        Class<?> rName = Class.forName(全限定类名);
        
        /**
         * 获取构造方法
         * 
         */
        //获取___所有public的构造方法,
        //如果还要获取所有的构造方法用getDeclaredConstructors()方法
        Constructor<?>[] constructors = rName.getConstructors();
        //获取___指定的构造方法,这获取的是无参构造方法,
        //要获取有参的请在行参列表上写上(数据类型.class,数据类型.class);
        Constructor<?> constructor = rName.getConstructor();
        //调用___无参构造方法
        Object newInstance = constructor.newInstance();
        
        /**
         * 获取方法
         * 
         */
        //获取___类中所有的public修饰的方法,其中包括父类的方法。
        //如果还要获取所有的方法用getDeclaredMethods()方法
        Method[] methods = rName.getMethods();
        //获取___指定的方法,这获取的是无参方法,
        //要获取有参的请在行参列表上写上(指定的方法名,数据类型1.class,数据类型2.class);
        Method method = rName.getMethod(方法名);
        //调用___非static修饰的方法需要invoke(对象,实参1,实参2),
        //有static修饰的方法需要invoke(null,实参1,实参2)。
        //我这调用的非static修饰方法没有参数就只需一个对象
        method.invoke(newInstance);
        /**
         * 获取字段
         * 
         */
        //获取___类中的public字段。如果还要获取所有的字段用getDeclaredFields()方法
        Field[] fields = rName.getFields();
        //获取___指定的字段。
        Field field = rName.getDeclaredField(指定的字段名);
        //设置___指定的字段,非static修饰,set(对象,值);有static修饰,set(null,值)
        field.set(newInstance,5.2);
        //调用___指定字段的值,非static修饰,get(对象);有static修饰,get(null)
        Object object = field.get(newInstance);
        System.out.println("指定字段的值=="+object);
        
        /**
         * 破坏包装declaredField.setAccessible(boolean)破坏封装,可以调用私有成员
         * true:破环
         * false:默认值,不破坏
         */
        Field field2 = rName.getDeclaredField(私有化的字段名);
        //破坏封装,不让字段私有化
        field2.setAccessible(true);
        //设置字段的值
        field2.set(newInstance,值);
        //调用设置后的字段值,并打印
        Object object2 = field2.get(newInstance);
        System.out.println("破坏封装==="+object2);
        
        //获取全限定类名
        String name = rName.getName();
        System.out.println("全限定类名: "+name);
        
        //获取类名简写
        String simpleName = rName.getSimpleName();
        System.out.println("类名简写: "+simpleName);
    }
}
复制代码

二:两种设计模式粗略解释

  1.单例模式: 分为 饿汉模式 懒汉模式

    饿汉是提前在静态域内就建立好一个实例等着拿去使用,由于是一个static的而且无其他方法能对此进行操作所以是个安全的,且线程安全

    懒汉是提供一个实例方法,方法能获取一个实例,也是唯一一个实例,因为构造方法也一样被私有化了,只能通过这个方法获取实例,但因为无其他保障,所以是个不安全的

  2.线程安全的懒汉

    1.使用双锁,synchronized保护方法,volatile保护实例

    2.静态内部类

    3.枚举

  3.如何破坏单例

    1.反射

    2.克隆

    3.序列化

  4.工厂模式

    简单的来说就是消费者和生产者之间的关系

    使用BlockingQueue能轻松实现个简易的工厂模式

  

posted @   Lzzycola  阅读(117)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示