存档

‘Java’ 分类的存档

RuntimeException

2009年10月19日 低调の华丽 没有评论

RuntimeException是非检查型异常,所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类。

public class TestA {
	public static void main(String[] args) {
		throw new RuntimeException();
	}
}

上面代码的编译没有问题。

常见的RuntimeException有:

NullPointerException:空指针异常
 
NumberFormatException:继承IllegalArgumentException,字符串转换为数字时异常。
比如int i= Integer.parseInt("ab3");
 
ArrayIndexOutOfBoundsException:数组越界
比如 int[] a=new int[3]; int b=a[3]; 
 
StringIndexOutOfBoundsException:字符串越界
比如 String s="hello"; char c=s.chatAt(6);
 
ClassCastException:类型转换错误
比如 Object obj=new Object(); String s=(String)obj; 
 
ClassCastException:类型转换错误
比如 Object obj=new Object(); String s=(String)obj; 
 
UnsupportedOperationException:***作不被支持,如果我们希望不支持这个方法,可以抛出这个异常。既然不支持还要这个干吗?有可能子类中不想支持父类中有的方法,可以直接抛出这个异常。
 
ArithmeticException:算术错误,典型的就是0作为除数的时候。
 
IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常。
分类: Java 标签: ,

Java对象中代码的执行顺序

2009年10月19日 低调の华丽 没有评论

主要涉及到三个方面,静态代码块,基本代码块以及构造方法

1.静态代码块是类在加载到类加载器后即执行的代码块,所以比其他二者都优先执行。

2.在同一个类中,如果碰到有多个静态代码块,则顺序执行各代码块。在父类与子类中,先执行父类的静态代码块,再执行子类的静态代码块。

3.在构建新对象时,先执行基本代码块,后执行构造方法。在父类与子类中,先执行父类的代码块/构造方法,后执行子类的代码块/构造方法

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Bird {
	{
		System.out.print("b1 ");
	}
 
	public Bird() {
		System.out.print("b2 ");
	}
	static{
		System.out.print("b3 ");
	}
}
 
class Raptor extends Bird {
	static {
		System.out.print("r1 ");
	}
 
	public Raptor() {
		System.out.print("r2 ");
	}
 
	static {
		System.out.print("r3 ");
	}
}
 
class Hawk extends Raptor {
	public static void main(String[] args) {
		System.out.print("pre ");
		new Hawk();
		System.out.print("hawk ");
	}
}

Result:b3 r1 r3 pre b1 b2 r2 hawk

分类: Java 标签:

Spring AOP

2009年10月19日 低调の华丽 没有评论

AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,一种新兴的编程技术。

AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等横切关注。当未来系统变得越来越复杂,横切关注点就成为一个大问题的时候,AOP就可以很轻松的解决横切关注点这个问题。

Spring主要通过代理来实现AOP
下面是AOP的一些基本概念:
切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)
连接点(JoinPoint):被拦截到的点,泛指方法
切入点(CutPoint):对哪些连接点进行拦截的定义
通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)
引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。
目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。
Spring主要通过代理来实现AOP 。

下面是AOP的一些基本概念:

切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)

连接点(JoinPoint):被拦截到的点,泛指方法

切入点(CutPoint):对哪些连接点进行拦截的定义

通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)

引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。

目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。

AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。

Spring提供两种方式实现AOP,一种是XML配置的方式,一种是annotation注解的方式

总结一下AOP的优点:
面对方法编程并不是要取代面对对象编程,而是要提高它。AOP程序员一般来说都是90%使用OOP来解决问题,而10%是用AOP来解决OOP不能解决的问题。

横切关注点(Cross-cutting Concerns)
很多时候你发现你的类并不能十分清晰和明白的表到你所想表达的功能意义,因为你真正的代码
大多被其它代码所包围了。如果你想很好的扩展或集成你所想表达的功能意义,你最好就用方面
的思想来考虑它了。

开发中的分层(Layering Based on Deployment)
AOP另外一个很有用的地方就是可以用来为你的应用程序分层。很多时候你希望的一些特殊应用或
类是可以很好的配置的,但同时也希望这些东西是不臃肿和可以扩展的。AOP提供了很好的途径来
分层这些复杂的东西。JBOSS AOP提供了XML配置的机制来配置每个方面的开发。最好的例子就是
缓存服务,它提供了不同的锁机制。这些缓存锁机制可以很好的织入你的类,而不影响你的类的
代码,这样你的类就是很好的扩展性了。

透明性(Transparency)
很多时候你都想把你的程序的焦点集中在商务应用和应用逻辑上,而不是关注于中间件的开发。
AOP允许你透明的应用中间件而不再使你的代码收到污染。一个很好的例子就是JBOSS AOP中的
用户认证上面。

异常处理
处理异常是AOP提供给我们另外一个很有用的东西。例如,SQLException异常包含了SQL语句的
异常信息或者数据库的死锁等信息,但这些信息却使用不同错误代码和信息。AOP可以让你拦截
SQL语句信息,并分类处理数据库死锁信息。

参考:http://www.javaeye.com/topic/480860

分类: Java 标签: , ,