类对象

Java反射和设计模式

好久不见. 提交于 2019-12-21 11:19:22
目录 Java反射 反射 为什么需要反射 类对象 反射相关的类 常见操作 获取类对象的方法(3种) 获取类中的构造方法 获取、调用类中的普通方法 获取、设置类中的属性 特例(带有数组参数的方法) 反射优点和缺点 使用反射模拟实际插件开发 内省 设计模式介绍 设计模式 单例设计模式 实现方式一:饿汉子(类加载时创建,天生线程安全) 实现方式二:懒汉子 实现方式三:静态内部类 简单工厂模式(不属于23种GOF设计模式之一) 案例 Java反射 反射 反射就是把Java类中的各种成分映射成一个个单独Java对象进行操作。 本质 :就是类的解剖技术。 类中成分主要包括:成员变量,构造方法,包等。 为什么需要反射 需求:我公司定义了一组接口,然后第三方公司按照我公司的接口实现了一套功能,然后交给我们,但是我们公司的项目已经结束,如何实现动态加载第三方公司提供的功能? 插件开发 (反射技术) 类对象 类的对象:基于某个类new出来的对象,也称实例对象。 类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法) 反射相关的类 Class类——可获取类和类中的成员信息 Filed类——可访问类的属性 Method类——可调用类的方法 Constructor类——可调用类的构造方法 常见操作 获取类对象的方法(3种) 通过类的对象的 getClass(); 方法

AJPFX浅谈Java性能优化之finalize 函数

北城余情 提交于 2019-12-21 00:43:17
★finalize 函数的调用机制   俺经常啰嗦:“了解本质机制的重要性”。所以今天也得先谈谈 finalize 函数的调用机制。在聊之前,先声明一下:Java虚拟机规范,并没有硬性规定垃圾回收该不该搞,以及该如何搞。所以俺这里提到的 finalize 函数的调用机制,或许适用于大多数 JVM,但【不保证】适用于所有的 JVM。 ◇何时被调用?   finalize 啥时候才会被调用捏?一般来说,要等到JVM开始进行垃圾回收的时候,它才【 有可能 】被调用。而 JVM 进行垃圾回收的时间点是【非常】不确定的,依赖于各种运行时的环境因素。正是由于 finalize 函数调用时间点的不确定,导致了后面提到的某些缺点。 ◇谁来调用?   说完何时调用,咱接着来聊一下被谁调用?   常见的 JVM 会通过 GC 的垃圾回收线程来进行 finalize 函数的调用。由于垃圾回收线程比较重要(人家好歹也是 JVM 的一个组成部分嘛),为了防止 finalize 函数抛出的异常影响到垃圾回收线程的运作,垃圾回收线程会在调用每一个 finalize 函数时进行 try/catch,如果捕获到异常,就直接丢弃,然后接着处理下一个失效对象的 finalize 函数。 ★对 finalize 函数的误解和误用 ◇把 finalize 理解为“析构函数”   学过 C++ 的同学应该都知道“析构函数”

java开发必学知识:动态代理

点点圈 提交于 2019-12-20 12:42:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一句话概括:java动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单、实用、灵活,是java开发必学知识,本文将对动态代理使用进行详细介绍。 1. 引言 最近开发项目过程中需要使用动态代理来实现功能,趁此机会把动态代理的知识点进行了一次梳理。在java开发过程中,当需要对已有的代码(方法)前后添加新功能,而不想修改或不方便修改原代码的情况下,如需要在执行某个已有的方法前后输出日志,以记录方法执行的记录,这个时候,动态代理就派上用场了。动态代理可以有以下几使用场景: 记录跟踪:对函数执行前后统一输出日志跟踪执行情况 计时:统一对函数执行用时进行计算(前后时间记录之差) 权限校验:统一在函数执行前进行权限校验 事务:统一对函数作为事务处理 异常处理:对某一类函数执行输出的异常进行统一捕获处理 动态切换数据源:多数据源切换或动态添加数据源 动态代理首先是代理,对应的有静态代理,然后是动态代理,在Spring中还有动态代理的应用-AOP(面向切面编程)。本文针对这些内容,梳理了以下几个知识点: 了解代理模式并实现静态代理 针对动态代理,描述它使用到的反射机制,以及JDK、CGLIB两种动态代理的实现 描述如何在在Spring中,使用AOP实现面向切面编程 本文所涉及到的静态代理、反射

类和正则表达

断了今生、忘了曾经 提交于 2019-12-20 08:49:26
类的三个基本特征:封装,继承,多态; 封装 封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏。 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 实现继承是指使用基类的属性和方法而无需额外编码的能力; 接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力; 可视继承是指子类使用基类的外观和实现代码的能力。 多态性 是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。 覆盖,是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数

小白之路由浅入深之------day12

北城余情 提交于 2019-12-19 02:41:23
内部类&API 目录 1. 参数传递 1.1 类名作为形参和返回值(应用) 1.2 抽象类作为形参和返回值(理解) 1.3 接口名作为形参和返回值(理解) 2. 内部类 2.1 内部类的基本使用(理解) 2.2 成员内部类(理解) 2.3 局部内部类(理解) 2.4 匿名内部类(应用) 2.5 匿名内部类在开发中的使用(应用) 3. 常用API 3.1 Math(应用) 3.2 System(应用) 3.3 Object类的toString方法(应用) 3.4 Object类的equals方法(应用) 3.5 冒泡排序原理(理解) 3.6 冒泡排序代码实现(理解) 3.7 Arrays(应用) 1. 参数传递 1.1 类名作为形参和返回值(应用) 1、类名作为方法的形参 方法的形参是类名,其实需要的是该类的对象 实际传递的是该对象的【地址值】 2、类名作为方法的返回值 方法的返回值是类名,其实返回的是该类的对象 实际传递的,也是该对象的【地址值】 示例代码: class Cat { public void eat ( ) { System . out . println ( "猫吃鱼" ) ; } } class CatOperator { public void useCat ( Cat c ) { //Cat c = new Cat(); c . eat ( ) ; }

Java总结篇系列:java.lang.Object

扶醉桌前 提交于 2019-12-18 18:35:51
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解。 Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起。 Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起。作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现。 Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入。Object类没有定义属性,一共有13个方法,具体的类定义结构如下图: 1.类构造器public Object(); 大部分情况下 ,Java中通过形如 new A(args..)形式创建一个属于该类型的对象。其中A即是类名,A(args..)即此类定义中相对应的构造函数。通过此种形式创建的对象都是通过类中的构造函数完成。为体现此特性,Java中规定:在类定义过程中,对于未定义构造函数的类,默认会有一个无参数的构造函数,作为所有类的基类,Object类自然要反映出此特性,在源码中,未给出Object类构造函数定义,但实际上,此构造函数是存在的。 当然,并不是所有的类都是通过此种方式去构建,也自然的, 并不是所有的类构造函数都是public。 2

Java第十二章反射机制

為{幸葍}努か 提交于 2019-12-18 14:07:43
Java Reflection Reflection(反射)是被视为 动态语言 的关键,反射机制允许程序在执行期借助于ReflectionAPO取得任何类的内部信息, 并能直接操作任意对象的内部属性及方法 Java反射机制提供的功能 》在运行时判断任意一个对象所属的类 》在运行时构造任意一个类的对象 》在运行时判断任意一个类所具有的成员变量和方法 》在运行时调用任意一个对象的成员变量和方法 》生成动态代理 主要内容:    1.理解Class类并实例化Class类对象    2.运行时创建类对象并获取类的完整结构    3.通过反射调用类的指定方法、指定属性    4.动态代理 反射相关的主要API: 》 java.lang.class:代表一个类 》java.lang.reflect.Method:代表类的方法 》java.lang.reflect.Field:代表类的成员变量 》java.lang.reflect.Construtor:代表类的构造方法 》。。。 1.理解Class类并实例化Class类对象 /* * java.lang.Class:是反射的源头 * * Class类 * * 我们创建了一个类,通过编译(javac.exe),生成对应的.class文件。之后我们使用java.exe加载(JVM的类加载器完成的)此.class文件, * 此

反射机制

你说的曾经没有我的故事 提交于 2019-12-18 11:22:19
概念: 指的是可以在运行时加载、探知、使用编译期间完全未知的类。程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类都可以知道该类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。 加载类完成后,在堆内存中,产生一个class类型的对象(一个类只有一个class对象),该对象就包括完整的类的结构信息通过该对象看到类的结构该对象如同一面镜子,透过其可看到类的结构,因此成为反射。 解决的问题: 由于在传统的创建对象的方法中,需要预先知道要使用的类,若要修改使用的类必须修改源码,因此使用反射机制。 使用: 获取类对象、操作属性、方法、构造器 1.反射获取类对象的三种方式: Class.forName();//根据全限定路径获取 对象.getclass();//根据对象获取 类名.class();//根据类名获取 2. 反射创建类对象(实现java对象的动态创建): Class cls=Class.forName(“类的路径”); Object obj=cls.newInstance();//对创建的类对象进行实例化 缺点:代码效率低 Class cls=类名.class(); Class cls=new 类名.getclass(); 3 .反射操作元素属性: Class cls=Class.forName(" ");//获取类对象 Field[ ]

Java复习笔记8--内部类

怎甘沉沦 提交于 2019-12-18 10:44:13
Java内部类 在《Think in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。 其实使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,但是如果我们不需要解决多重继承问题,那么我们自然可以使用其他的编码方式,但是使用内部类还能够为我们带来如下特性(摘自《Think in java》): 1、 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。 2、 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。 3、 创建内部类对象的时刻并不依赖于外围类对象的创建。 4、 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。 5、 内部类提供了更好的封装,除了该外围类,其他类都不能访问。 在这个应用程序中,我们可以看到内部了InnerClass可以对外围类OuterClass的属性进行无缝的访问,尽管它是private修饰的。这是因为当我们在创建某个外围类的内部类对象时,此时内部类对象必定会捕获一个指向那个外围类对象的引用,只要我们在访问外围类的成员时,就会用这个引用来选择外围类的成员。

线程池

戏子无情 提交于 2019-12-18 01:12:29
概念: 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。 使用线程池方式--Runnable接口 通常,线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。 步骤: 1、Executors:线程池创建工厂类   public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象 2、ExecutorService:线程池类   Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行 3、Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用   使用线程池中线程对象的步骤:   ①创建线程池对象   ②创建Runnable接口子类对象   ③提交Runnable接口子类对象   ④关闭线程池 演示: public class demo1 implements Runnable{ public void run() { for(int i=0;i<100;i++){ System.out.println("run....."+i); } } } public class xianchengchi { public static void