杂项笔记

180 阅读6分钟

==================================== “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递

从jvm的角度分析按值传递 从jvm的角度分析多态 从jvm的角度分析类变量,成员变量,局部变量

class{ private int i; }

上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。 如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。

====================================

URL对象用openconnection()打开连接;获得URLConnection类对象,再用URLConnection类对象的connect()方法进行连接

资源前缀'file:'、'http:'、'jar:'

=====================================

1.如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),

则ApplicationContext启动的时候就实例化该bean,并且将实例化的bean放在一个线程安全的 ConcurrentHashMap 结构的缓存中, 下次再使用该Bean的时候,直接从这个缓存中取 。 2.如果bean的scope是singleton(单例模式)的,并且lazy-init为true,则该bean的实例化是在第一次使用该bean的时候进行实例化 。 3.如果bean的scope是prototype(原始模型模式)的,则该bean的实例化是在第一次使用该Bean的时候进行实例化 scope:singleton,prototype,request

=====================================

1.JavaBean是一个可序列化的POJO,具有一个无参构造器,并且允许使用遵循简单命名约定的getter和setter方法来访问属性 2.POJO是一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类, 不遵循任何主要java模型,约定或者框架的java对象。在理想情况下,POJO不应该有注解。

=====================================

List在remove元素后报java.lang.UnsupportedOperationException

getFields() 获取所有public字段,包括父类字段 getDeclaredFields() 获取所有字段,public和protected和private,但是不包括父类字段

=====================================

F7 进入方法体 Shift + F8 退出方法体,跳到原来的地方

=====================================

默认情况下Spring中的事务处理只对RuntimeException方法进行回滚

===================================== BeanFactory是SpringIOC容器的真面目,Spring使用BeanFactory来实例化、配置和管理Bean BeanFactory 只能管理单例(Singleton)Bean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。 这是因为原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用

ApplicationContext接口由BeanFactory派生而来,提供了更多面向实际应用的功能

XmlBeanFactory,DefaultListableBeanFactory实现BeanFactory ClassPathXmlApplicationContext实现ApplicationContext

容器的基础XmlBeanFactory过时:可能的原因使用的了自定义的XML读取器XmlBeanDefinitionReader,没有规范约束 1.获取对XML文件的验证模式 2.加载XML文件,并得到对应的Document 3.根据返回的Document注册Bean信息

XmlBeanFactory extends DefaultListableBeanFactory DefaultListableBeanFactory 是整个bean加载的核心部分,是Spring注册及加载bean的默认实现

===================================== 如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制) 如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。

1.静态代理看起来是比较简单的 public interface SubjectInterface { void hi(); } public class RealSubject implements SubjectInterface { @Override public void hi() { System.out.print("hi"); } } public class SubjectProxy implements SubjectInterface{ private RealSubject r; public SubjectProxy() { r=new RealSubject(); }

    @Override
    public void hi() {
        System.out.println("proxy");
        r.hi();
    }
}
public class Client {
    public static void main(String[] args) {
       SubjectInterface subject = new SubjectProxy();
        subject.hi();
    }
}

2.Java SDK实现动态代理 --面向接口的代理模式 --不能继承父类的相应方法进行代理, --它只能代理实现了接口的类,如果一个类没有继承于任何的接口,那么就不能代理该类, --原因是我们动态生成的所有代理类都必须继承Proxy这个类,正是因为Java的单继承,所以注定会抛弃原类型的父类 实现java SDK动态代理主要有如下几个步骤: 实现 InvocationHandler接口,完成自定义调用处理器 通过Proxy的getProxyClass方法获取对应的代理类 利用反射技术获取该代理类的constructor构造器 利用constructor构造代理实例对象

ClassA a = new ClassA(); MyInvotion myInvotion = new MyInvotion(a); Class myProxy = Proxy.getProxyClass(ClassA.class.getClassLoader(), new Class[]{MyInterface.class}); Constructor constructor =myProxy.getConstructor(new Class[]{InvocationHandler.class}); MyInterface aProxy = (MyInterface)constructor.newInstance(myInvotion); aProxy.sayHello();

ClassA a = new ClassA(); MyInterface aProxy = (MyInterface)Proxy.newProxyInstance(ClassA.class.getClassLoader(),new Class<?>[]{MyInterface.class},new MyInvotion(a)); aProxy.sayHello();

3.第三方库cglib实现动态代理 --可以继承父类的相应方法;对于被代理类中的非public或者final修饰的方法,不能实现代理 首先我们通过Enhancer实例设置被代理类, 然后设置该代理类的回调,也就是在访问代理类方法的时候会首先转向该回调, 在回调中我们调用invokeSuper方法以fastclass这种非反射机制快速的调用到代理类中的方法, 其中代理类中方法又调用原类型的对应方法

ClassA ca = new ClassA(); -- ClassA extends ClassB implements MyInterface Enhancer enhancer = new Enhancer(); -- class ClassB enhancer.setSuperclass(ClassA.class); -- interface MyInterface enhancer.setCallback(new MyMethod()); --MyMethod implements MethodInterceptor ClassA my = (ClassA)enhancer.create();
my.welcome();

==========================================

模版方法模式 创建型模式5种 结构型模式7种 行为型模式11种

双亲委派模型

==========================================

线程的创建有三种方式:第一种是继承自Thread类 第二种方式是实现Runnable接口 第三种方式使用Callable接口

==========================================

枚举的单例

概念仅仅是说明问题的一种工具而已

动态语言,是指程序在运行时可以改变其结构,新的函数可以被引进,已有的函数可以被删除等在结构上的变化,类型的检查是在运行时做的,优点为方便阅读,清晰明了,缺点为不方便调试
动态类型语言和静态类型语言简单的区别就是在运行时检查[动态],还是编译期检查[静态]java;
强类型语言与弱类型语言,就是不同类型进行变量赋值时,是否需要显示地(强制)进行类型转换,强类型语言需要显式类型转换,而弱类型语言不需要显式的类型转换