Eclipse的使用技巧
---------------------- android培训、 java培训、期待与您交流! ----------------------Eclipe和Myeclipese的关系
MyEclipses是eclipse的一个插件,他是用java开发的,所以在启动的时候也是启动java虚拟机,所以的启动的时候也有点慢。
Eclipse是IDE开发工具,IDE的全称是itegrity development environment 集成开发环境。
开发工具只是在节省开发时间,提高开发效率。
工作间与工程
在ecllipse中可以创建多个工作间,但是每次只有一个工作间处于活动状态,可以对过个工作间进行切换。
一个工作间包函多个工程,一个工程下面有包含多个文件,可以是任意文件,没新建一个工程默认都有两个包,一个是用来存储类文件,一个是用来存储源文件,类路径文件,工程文件。
编译和运行
Eclipse本身是不提供编译环境和运行环境的,只能自己从新配置,可以对某个工作间或者某个工程进行配置,工作间与工作间互不影响,工程与工程之间也互不影响,如果在一个工作间下面配置,那么这个工作间下的所有工程默认都是采用同一个配置,如果在一个工程下面配置,则在这个工程下的java文件默认也是同一个配置。
单个工程javac 与java
可以再window下的首选项,选择java,可以对编译和运行进行设置,设置成那个版本,编译运行的时候就使用哪个版本操作。注意:如果使用高版本编写源程序,在低版本下不能编译高版本的程序,但是在高版本下可以编译低版本的程序。
工程的配置会覆盖工作间的配置。
Eclipse工程管理与快捷键配置
1.IDE开发工具都之处使用工程化方式管理一个
静态导入的程序开发过程,一般列说一个相对独立的项目就是一个工程,一个项目中涉及的多个java文件,资源文件等用一个工程进行管理,
2.快捷键配置,
在不同的工作间的快捷键配置互不干扰,在不同的工程下从新配置快捷键也互不干涉。在配置快捷键的时候要注意一些问题,就是当自己配置了某个快捷键的时候,在使用时并不产生作用,可能要检查一下,是否有其他的快捷键和自己配置的是一样的,如果是一样,则要改掉其中的一个,否则,配置的快捷键不起效。
透视图与视图
在不同的应用程序环境下默认下有不同的小窗口,每多个小窗口组成了透视图,每个单独的小窗口就是视图。多个视图预定的见面就是透视图。
调试
在行代码前双击产生一个点,右击,选择DEBUG调试,就可以进入debug透视图。
模板代码
当你输入简写的字母时,使用快捷键可以把完整的单词补全或某些代码补全。可以自己设置,在首选项中的java编辑下的模板,就可以设置了。
导入已有的工程
在菜单文件下选项导入----导入已有的工程-----在工作台目录下进行选择—完成,此时这个工程就会被导入这个工作台下。
增加库文件,就是自己在一个库中有多个jar文件,如果需要这些库的时候,可以直接导入库文件。
静态导入
使用Import语句可以导入一个类或某个包下的所有的类。
如果某个类中的成员都是静态的,那么可以使用静态导入,因为静态成员可以直接使用类名调用,所以导入静态成员,在程序中可以直接使用方法进行操作。格式是:import static java.包名:
可变参数
以前的重载就是使用多个同样的方法名来完成不同的功能,现在可以使用可变参数来简写这样的形式。
格式:返回类型 函数名(参数类型… 变量名){}
1.int add(T... a):该函数可以添加多个同种类型的数据,相当于函数的参数是数组形式。
2.int add(T a,T... a1):在传参数时,除了第一个为a,其他全部都是属于可变参数。
特点;
只能出现杂参数列表的最后;
…位于变量类型和变量名之间,前后有无空格都可以
调用可变参数的方法是,编译器为该可变参数隐含创建一个数字,在方法体中一数字的形式访问可变参数。
for循环增强
语法:
For(type类型变量名:集合或数组),
注意事项:
迭代变量必须在()中定义!
集合变量可以使数组或实现了iterable接口的类型的集合类。
也就是foreach语句,他是for(;;;)语句的一种简写形式,他也是吧集合或者数组中的元素遍历出来,但是他和for(;;;)还是有些区别,为什么呢?因为在循环多次的时候,传统的循环可以对其循环条件的控制,而增强for不能控制,增强for只能是简化书写,遍历集合或数组中的元素,不能直接遍历map集合,但是可以通过把map集合转成set集合后,再根据set集合迭代出元素。
基本数据类型的自动拆箱与装箱
为了对基本数据类型进行属性和方法的操作,所以出现了对基本数据类型有对象的包装类,。
自动装箱:自动将基本数据类型转成包装对象。
自动拆箱:自动将包装对象转成基本数据类型。
享元模式:
如果某个对象在其范围之内,那么将其存储在缓冲区中,在使用时直接就可以取出,并不对其进行修改,但是如果大于类型的范围时,他的值会发生变化,取出时的值就不同。
例如:
Interger i1=126;
Integer i2=126;
他们指向的对象是一个。因为他们属于这个类型的范围。
Integer i3=129;
Integer i4=129;
他们不是同一个对象,因为他们不属于这个类型的范围。
枚举
为什么要枚举
问题:要定义星期几或性别的变量,该怎么定义?假设1-7分别表示星期一到星期日。定义的类型是固定的值,在编写的时候就可以判断其值是否合法。
枚举的原理
用普通类是实现枚举原理
//将类变为抽象类
Public class WeekDay{
Private WeekDay(){}
Public final static WeekDay SUN;=new WeekDay(){
//实现WeekDay中的nextDay抽象方法
Public WeekDay nextDay(){
Retrun MON;
}
};
Public final static WeekDay MON=new WeekDay(){
//实现WeekDay中的nextDay抽象方法
Public WeekDay nextDay(){
Retrun SUN;
};
//在这里可以使用抽象方法来实现将多个if…else转成独立的类
//将nextDay方法变为抽象方法
Public WeekDay nextDay();
/*
Public WeekDay nextDay(){
Fi(this==SUNM)
{
Return MON;
}
Else
{
Return SUN;}
}}
*/
Public Stirng toString(){
Return this==SUN?”SUN”:”MON”;
}
}
Public class EnumDemo{
Public static void main(String [] args){
//如果选择了星期日,那么他对应的下一天就是星期一。
WeekDay w=WeekDay.SUN;
System.out.println(w.nextDay());
}
}
枚举的应用
Public enum WeekDay{
SUN,MON,TUE,WED,THI,PRI,SAT;
}
枚举本身定义的变量就一个对象。
枚举自己提供的方法
Name():返回该对象的名称
Ordinal():返回在枚举类中排第几个
静态方法
valueOf(对象).toString():返回该对象的值。
实现枚举带有构造方法
构造方法必须是私有的
Public enum WeekDay{
SUN(),MON(1),TUE,WED,THI,PRI,SAT;
Private WeekDay(){}
Private WeekDay(int day){
System.out.println(“first”);
}
}
提示:如果在定义对象的后面跟上大括号,定义了值,那么在构造方法执行时,他就指向哪个对象。
实现抽象方法的枚举
例如:
Public enum TrafficLamp{
//定义三个对象,使用子类实现本类中的抽象方法,灯要停留的时间,那就传入这个时间
//红灯停留20秒
RED(20){
Public TrafficLamp nextLamp(){
Return YELLOW;
};
},
//黄灯停留3秒
YELLOW(3){
Public TrafficLamp nextLamp(){
Return GREEN;
};
},
//绿灯停留10秒
GREEN(10),{
Public TrafficLamp nextLamp(){
Return RED;
};
};
//定义抽象方法,返回交通灯
Public abstact TrafficLamp nextLamp();
Private int time;
Private TrafficLamp(int time){this.time=time;}
}
枚举只有一个成员是,就可以作为一种单例的实现方式。
反射
透彻分析基础Class类
Class :代表某一类事物的共性,该类事物有什么实现,没有什么属性,至于这个属性的值是什么,则是有这个类的实例对象来确定,这个实例对象有不同的属性值,java程序中的各个java类,他们是否属于同一类事物,世博园是可以用一个类来描述这个事物,这个类的名称就是Class,要住与小写class关键字的区别。
Classl类的对象是字节码,当加载字节码时,就创建一对象,每个字节码就是一个对象。
得到字节码的三种方式:
类名.class
对象名.getClass()
Class.forName(“类名”):这是静态方法。
得到字节码有两种情况
1. 已经加载了字节码,
2. 没有字节码,在创建字节码
八种基本数据类型对应有字节码,有就是有一个对象已知对应。
String str=”abc”;
Class s=String.class;
Class s1=str.getClass();
Class s2=Class.forName(“java.lang.String”)
S=s1:返回true;
S=s2:返回true;
因为一个类只产生一个字节码,所以他们返回都是true;
Int.class=Integer.TYPE 返回true 因为包装类型的TYPE指向的也是基本数据类型。
总之,只要是在源程序中出现的类想,都有各自的 Class实例对象。
反射的概念
反射就是把java类中的各种成分映射成相应的java类,例如:一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量构造方法包等信息业用一个个的java类来表示,反射导致性能下降。
Constructor类
Constructor类代表某个类中的一个构造
getConstructor():得到类中的一个构造方法
getConstructors():得到类中的多个构造方法
例如:
//new String(new StringBufffer(“abc”))
//或得方法时所要用到的类型(Stringbuffer.class)
Constructor constructor1=Sting.class.getConstructor(StringBuffer.class);
//获得方法是要用到的对象(new StirngBuffer(“abc”))
Stirng s=(String)constructor1.newInstance(new StirngBuffer(“abc”));
System.out.println(s.charAt(2));
变量的反射
Filed类
Filed类代表一个成员变量
ReflectPoint pt1=new ReflectPoint(3,5);
//首先得到这个字节码,再获取变量。
Filed fieldy=pt1.getClass.getField(“y”);
//field的值是多少?是5,错! Field不是对象身上的变量,而是类上的。
Fieldy.get(pt1);
实例:
作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成”a”;
Public class ReflectPoint{
Private int x;
Public int y;
Public Stirng st1=”ball”;
Public Stirng st2=”baskedball”;
Public Stirng s2=“itcast“;
Public ReflectPoint(int x,int y)
{
This.x=x;
This.y=y;
}
}
Flied[] fields=obj.getClass().getFields();
For(Field field:fields)
{
If(field.getType()==String.class){
String oldVlue=(Stirng)Field.get(obj);
String newValue=oldValue.replace(‘b’,’a’);
Field.set(obj,newValue);
}
}
Method类
Method methodCharAt=Stirng.class.getMethod(“charAt”,int.class);
methodCharAt.invoke(str1,1);
如果传递给Method对象的invoke()方法的第一个参数为Null,这样看有什么意义嫩,说明该Method对象对应的是一个静态方法。
Jdk1.4和jdk1.5invoke方法的区别
需要将一个数字作为参数传递给invoke方法是,数组中的每个元素分别对应着被调用方法指导而一个参数,所以,调用charAt方法的代码页可以用jdk1.4改写成charAt.invoke(“str”,new Object[]{1})形式。
对接收数组参数的成员方法进行反射
写一个程序,这个程序能够根据
String statingClassName=args[0];
Method mainMethod=Class.forName(startingClassName).getMethod(“mian”,String[].class);
mainMethod.invoke(null,new Object[]{new String[]{“sfae”,”sfsf’}});
因为传入的Iivoke方法的第一个参数是空,那是因为这个mian方法是静态的,所以不需要对象。
数组反射
具有相同尾声和元素类型的数组属于同一个类型,即具有相同的Class实例对象,
代表数组的Class实例对象getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当做Object类型使用,不能当作object[]类型使用:非基本类型的一维数组,即可当做Object类型使用,又可以当做Object[]类型使用。
Arrays.asList()方法处理int[]和String[]时的差异。
Arrays工具类用于完成对数组的反射操作。
Int[] a1=new int[3];
Int [] a2=new int[4]
Int[][] a3=new int[2][3];
Stirng[] a4=new String[3];
a.getClass()==a2.getClass() 返回true
a.getClass(==a3.getClass返回false
如果都是同种类型的类型数组,那么他们返回都为true;
如果不是不同的类型数组,那返回为false;
思考题:怎么得到数组中的元素类型?
Private static void printObject(Object obj)
{
Class clazz=obj.getClass();
If(clazz.isArray()){
Int len=Array.getLength(obj);
For(int i=0;i<len;i++){
System.out.println(Array.get(obj,i);
}
Else{
System.out.println(obj);
}
}
反射的作用
框架与框架要解决的核心问题
我做房子卖给用户住,有用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的额框架,把门窗插入进我提供的框架中,框架与工具类有区别,工具了被用户的类调用,而框架是调用用户提供的类,
框架要解决的核心问题
我在写框架(房子)是,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?
因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而用反射方式类做,
框架编写:
//加载properties文件
InputStream ips=new FileInputStream("conf.properties");
Properties props=new Properties();
props.load(ips);
ips.close();
//从properties文件中获取类
String className=props.getProperty("className");
//创建这个类的实例对象
Collection collections=(Collection)Class.forName(className).newInstance();
文件加载
RelectTest.class.getClassLoader().getResourceAsStream(“conf.properties);
RelectTest.class.getResourceAsStream(“conf.properties);
Javabean内省
内省引出javaBean的解释。
内省:对javabean进行检查,
javaBean:特殊的java类。主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块间传递多个信息,可以讲这些信息封装到一个javabean中,这种javabean的实例读写通常称之为值对象,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么号呢?javabean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量,如果方法名为setid中文意思都为设置id,至于你把他存到那个变量上,如果方法名getid中文意思即为获取id,至于你从南个变量上取,去掉set前缀,剩余部分就是属性名,如果剩余部分的第二格字母是小写的,则把剩余部分的首字母改成小写的。
总之。一个类被当做javabean使用是,javabean的属性是根据方法名推断出来的,他根本看不到java类内部的成员变量。
Int getAge()
Void setAge(int age);
符合这种类型的java就叫javabean。
Age-à如果第二格字母是小写的,则把第一个字母编程小写的àage
用内省的方式对javabean进行操作:
ReflectPoint t=new ReflectPoint(3,5);
String propertyName=”x”;
PropertyDesceiptor pd=new PropertyDescriptor(propertyName,pt.getClass;
Method methodGetX=pd.getReadMethod();
Object retVal=methodgetX.invoke(pt);
System.out.println(retVal);
Beanutils工具包
演示用eclipse如何加入jar包,先知识引入beanutils包,等程序运行出错后再引入logging包。
在前面内省例子的基础上,用beantils类先get原来设置好的属性,再将其set为一个新值。
Get属性是返回的结果为字符串,set属性对象,通常使用字符串。
用proyutls类先get原来设置好的属性,在其set一个新值,
注解
注解就是告诉java开发工具应注意的符号传达信息
@SuppressWarnings
通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings(“deprecation”);
@Deprcated
注解在刚才的类中增加一个方法,并加上@Deprecated标记,在另外一个类中调用这个方法。
@Override
Public Boolean equals(Reflect other)方法与HashSet结合讲解。
总结:
注解相当于一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器的开发工具盒其他车型可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
看java。Lang包,可看到jdk中提供的最基本的annotation.
自定义注解及其应用
定义一个最简单的注解:public @interface MyAnnotation{}
把他加载某个类上:@MyAnnotation public class Annotation Test{}
用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
根据发射测试的问题,引出@Retention元注解的注解,其三中取值:
RetentionPolicy.SOURCE/RetetionPolicy.CLASS//RetetionPolicy.RUNTIME;分别对应:java元文件----àclass文件----à内存中的字节码。
演示和讲解@Target元注解。
Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解即报错了,改为用设置方式设置{ElementType.METHOD.ElementType.TYPE}就可以了。
元注解以及其枚举实现值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图搜索即可查到,或者直接看java.lang.annotionn包下面的类。
为注解增加基本属性
什么是注解的属性?
一个注解相当于一个胸牌,如果你胸剪贴了胸牌,就是传智博客的学生否则,就不是,如果还想区分成是传智博客哪个班的学生,中石化可以为胸牌在增加一个属性啦进行区分,加了属性的标记效果为:@MyAnnotion(color=”red”)
定义基本类型的属性和应用属性:
在直接类中增加String color();
@MyAnnotation(color=”red”)
用反射方式活儿注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a=(MyAnnotation)AnnotationTest.class.getANNOTATION(Annotation.call);
System.out.println(a.coor);
可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象
为属性指定缺省值:
String color() default “yellow”;
Value属性:
String value() default “zxx”
为注解增加高级属性
数组类型的属性
Int[] arrayArr() default{1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括号
枚举类型的属性
EnumTest TrafficLamp();
@MyAnnotation(lamp=EnumTest TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotation annoationAttr() default @MetaAnnotation(“xxx”);
@MyAnnotation(annoationAttr=@MetaAnnotation(“yyy”))
可以认为上面这个@MyAnnotation是MyAnnotaion是MetaAnnoation类的一个实例对象,调用代码如下:
MetaAnnotation ma=myAnnotation.annotaionAttr();
System.out.println(ma.value());
注解的详细语法可以过刊java语言规范了解,即看java的langagespecificaton.
泛型
Jdk1.5出现的安全机制。提高效率,提高安全性
好处:
1. 将运行时期的问题classCastExceptoin转到了编译时期。
2. 避免了强制转换的麻烦。
<>:什么时候用?当操作的引用数据类型不确定的时候,,就使用<>,将要操作的引用数据类型传入即可,其实<>就是一个用于接收具体引用数据类型的参数范围。
在程序中,只要用到了带有<>的类或者接口,就要明确传入的引用数据类型。
泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全。
运行时,会将泛型去掉。生成的class问题中是不带泛型的,这个叫泛型的擦除。为什么擦除呢?因为为了兼容运行的类加载器。
泛型的补偿:下运行时,通过获取元素的类型进行转换动作,不用使用者在强制转换了。
泛型类:什么时候用?当类中的操作的引用数据类型不确定时候,就可以使用泛型类来表示。
当方法静态时,不能访问类上定义的泛型,如果静态方法使用泛型,只能将泛型定义在方法上。
泛型接口:将泛型定义在接口上。
泛型的通配符:?未知类型
?extends E:接收E类型或者E的子类对象,上限
一般在存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算的,不会出现类型安全隐患。
?super E:接收E类型或者E的父类对象,下限
什么时候用下限呢?通常对集合中的元素进行取出操作时。可以用下限。
类加载器
简要介绍上面是类加载器和类加载器的作用
Java虚拟机中可以安装多个累加载器,系统默认三个主要累加载器,每个类负责加载特定位置的类:
BootStrap,ExtClassLoader,AppClassLoader
类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,湿热按必须有第一个类加载器不是不是java类,这正是BootStrap。
Java虚拟机中的所有类装载器采用具有父子类关系的树形结构进行组织,在实例化每个类装载器对象是,需要为其制定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
类加载器的委托机制
当java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前星汉城的类加载器去加载线程中的第一个类,
如果了A中引用了类B,java虚拟机将使用加载类的A类装载器去加载某个类,
每个类加载器加载类时,又先委托给其上级类加载器,
当所有祖宗累加载器没有家爱到类,回到发起者类加载器,还加载不了,则抛CLassNotFoundException,不是在去找发起者类架子器的儿子,因为么有多个儿子,找哪一个呢?
对着累加载器的层次结构图和为头加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。
编写自己的类加载器
知识讲解
自定义的了加载器的必须继承ClassLoader
loasdClass方法与findClass方法
defineClass方法
编程步骤
编写一个队问价内容进行简单加密的程序
编写了一个自己的类装载器,可实现对加密过的了进行装载和解密
辨析而一个程序调用类加载器加载类,在源程序中不能用噶类名定义引用变量,因为编译器无法识别这个类,程序中可以除了使用ClassLoader.load方法之外,还可以使用设置线程的上下文类加载器或者系统类加载器,然后再使用Class.forNmae.
实验步骤
对不带包名的calss文件进行加密,加密结果存放到另外一个目录,例如:java MyClassLoader MyTest.class F://ITCAST
运行加载类的程序,结果能够被正常加载,但打印超类的类装载器名称为AppClassLoader java MyClassLoader MyTestF:///itcast
用加密后的类文件替换CLASSPATH环境下类文件,再执行上一步操作就出问题了,错误说明是AppClassLoader类装载器装载失败。
删除CLASSPATH环境下的类文件,再执行上一步操作就没有问题了。
模板方法设计模式
父类--àloadclass/findClass得到class文件袋额转换成字节码
子类:(自己干)
程序中的代理
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理,日志,计算方法的运行时间,事务管理。等,
编写一个目标类将具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上功能的代码,
如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类,还是代理类,这样以后很容易切换,譬如,想要日志功能是就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。
安全,事务,日志,等功能要贯穿到多个模块中,所以,他们就是交叉业务。
AOP
JVM可以再运行期动态生成类的字节码,这种动态生成得嘞往往被用作代理类,即动态代理类,
JVM生成的动态类必须实现一个活多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理
CGLIB库可以动态生成一个类的子类,一个类的字类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库,
代理类的各个方法中通常除了要调用目标的相应方法和对外付汇目标付汇的结果成,还可以
在代理方法中的如下四个位置加上系统功能代码:
在调用目标方法之前
在调用目标方法之后
在调用目标方法前后
在处理目标方法异常的catch块中。
分析JVM动态生成的类
创建实现了Collection接口的动态类和查看器名称,分析Proxy.getProxyClass方法的各个参数,
编码列出动态类中的所有构造方法和参数签名
编码列出动态中的所有方法和参数签名
创建动态类的实力对象
用反射或得构造方法
编写一个最简单的InvocationHandler类
调用构造方法创建动态类的实例对象,并将编写的InvocaitonHandler类的实例对象传进去
打印创建的对象和调用对象的额没有返回中的方法和getClass方法,演示调用其他有返回值的方法报告了异常,
将创建动态类的实例对象的代理改成匿名内部类的形式编写,锻炼大家习惯匿名内部类。
总结思考:让JVM创建动态类,消炎药给她提供哪些信息?
三个方面:
生成的类中有哪些方法,通过让其实现哪些接口方法进行告知;
产生的类字节码必须有个一个关联的类加载器对象;
生成的类中的而方法的代码时怎样的饿,也得由我们提供,把我们代码写在一个约定好了接口对象对方法中,把对象传给她,他调用我的方法,即相当于插入了我的二代目,提供执行的对象就是那个InvocationHandler对象,他是在创建动态类的实例对象的构造方法是传递进去的,在上面的InvocationHandler对象的invoke方法中加一点代码,就可以看到这些代码被调用运行了。
用哪个proxy.newinstance放直接一步就创建成代理对象。
实现AOP功能的封装与配置
工厂类beanfactory负责创建目标类或代理类的实力对象,并通过配置文件实现切换,其gettBran方法根据参数字符串返回一个相应的实例地形,如果参数字符串在配置文件对需要得类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类对象的getProxy方法,返回的对象。
ProxyFactry的构造方法介绍代表配置文件的输入流对象。配置文件格式如下:
#xxx=java.util.ArrayList
xxx.target=java.util.ArrayList
ProxyFactyBean充当封装生成动态代理的工厂,需要为工厂类提供哪些配置从那时信息?
目标
通知
编写客户端应用
编写实现Advice借壳的类和在配置文件进行配置
调用BeanFactry获取对象
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima