-------android培訓java培訓期待與您交流!----------
靜態(tài)導入
-
import static
:導入一個類中的某個靜態(tài)方法或所有靜態(tài)方法秉氧。如:import static java.lang.Math.max;
,導入的是Math下的max方法茵瀑。
package com.sergio.NewTecl;
//靜態(tài)導入包中的所有靜態(tài)方法
import static java.lang.Math.*;
//靜態(tài)導入包中某個靜態(tài)方法
//import static java.lang.Math.max;
/**
* 靜態(tài)導入例子
* Created by Sergio on 2015-06-03.
*/
public class ImportStatic {
public static void main(String[] args) {
System.out.println(max(3, 7));//求租嗲之
System.out.println(abs(4 - 3));//求絕對值
}
}
可變參數(shù)
- 只能出現(xiàn)在參數(shù)列表的最后;
-
...
位于變量類型和變量名之間鞋仍,前后有無空格都可以趴乡; - 調(diào)用可變參數(shù)的方法時挣饥,編譯器為該可變參數(shù)隱含創(chuàng)建一個數(shù)組蓖捶,在方法體中以數(shù)組的形式訪問可變參數(shù)地回。
package com.sergio.NewTecl;
/**
* 可變參數(shù)
* Created by Sergio on 2015-06-03.
*/
public class VariableParam {
public static void main(String[] args) {
System.out.println(add(3, 6));
System.out.println(add(3, 1, 93, 23));
}
public static int add(int x, int... args) {
int sum = 0;
for (int i = 0; i < args.length; i++) {
sum += args[i];
}
return sum;
}
}
foreach
- 語法:
for(type 變量名:集合變量名){...}
- 注意事項:迭代變量必須在()中定義;集合變量可以是數(shù)組或?qū)崿F(xiàn)了Iterable接口的集合類俊鱼。
package com.sergio.NewTecl;
/**
* foreach
* Created by Sergio on 2015-06-03.
*/
public class ForEach {
public static void main(String[] args) {
int[] buf = new int[] {3, 5, 6, 4, 2, 8};
int sums = 0;
for (int sum : buf) {
sums += sum;
}
System.out.println(sums);
}
}
自動裝箱拆箱
- 基本數(shù)據(jù)類型封裝成引用數(shù)據(jù)類型刻像。
- 引用數(shù)據(jù)類型拆箱成基本數(shù)據(jù)類型。
基本數(shù)據(jù)類型 | 引用數(shù)據(jù)類型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
boolean | Boolean |
float | Float |
double | Double |
char | Character |
- 注意:在基本數(shù)據(jù)類型的范圍類并闲,裝箱成引用數(shù)據(jù)類型的兩個對象引用相同值细睡,他們兩個對象的值是相等的。
- 共享設計模式:避免大量擁有相同內(nèi)容的小類的開銷帝火,使大家共享一個類(元類)溜徙。
package com.sergio.NewTecl;
/**
* 裝箱與拆箱
* Created by Sergio on 2015-06-03.
*/
public class AutoBox {
public static void main(String[] args) {
Integer i = 2;//裝箱
Integer i2 = 4;
System.out.println(i + i2);//拆箱
Integer i3 = 12;
Integer i4 = 12;
//在int范圍內(nèi),i3和i4對象引用的值相等
System.out.println(i3 == i4);
Integer i5 = 138;
Integer i6 = 138;
//超出了int范圍犀填,i5和i6的引用值不相等蠢壹。
System.out.println(i5 == i6);
}
}
枚舉
- 讓某個類型的變量的取值只能為若干個固定值中的一個。
package com.sergio.NewTecl;
/**
* 枚舉應用示例
* Created by Sergio on 2015-06-04.
*/
public class EnumTest1 {
public static void main(String[] args) {
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay.name());//枚舉對象的名字
System.out.println(weekDay.ordinal());//排列位置九巡,從0開始
System.out.println(WeekDay.valueOf("SUN"));//將字符串轉(zhuǎn)成枚舉對象
System.out.println(WeekDay.values());//獲得枚舉元素的轉(zhuǎn)化成數(shù)組
}
public enum WeekDay {
SUN, MON, TUE, WED, THI, FRI, SAT
}
}
- 構(gòu)造方法枚舉
public enum WeekDay {
SUN(2), MON(), TUE, WED, THI, FRI, SAT;//枚舉的元素相當于枚舉類型的對象图贸,
// 初始化時可以按照參數(shù)構(gòu)造方法帶入
//空構(gòu)造方法
private WeekDay() {
System.out.println("first");
}
//帶參數(shù)構(gòu)造方法
private WeekDay(int day) {
System.out.println("second");
}
}
- 抽象方法枚舉
public enum TrafficLamp {
//子類對象帶參構(gòu)造方法
RED (30){
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN (45){
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW (5){
public TrafficLamp nextLamp() {
return RED;
}
};
//枚舉的抽象方法,需要枚舉的元素即子類對象來實現(xiàn)
public abstract TrafficLamp nextLamp();
private long time;
//枚舉元素子類對象的構(gòu)造方法
private TrafficLamp(long time){
this.time = time;
}
}
內(nèi)省與JavaBean
- 內(nèi)拭峁恪:IntroSpector疏日。主要用于操作JavaBean。
- JavaBean:特殊的Java類撒汉,類中的方法名稱符合某種約定的規(guī)則沟优。如:
getAge()
、setAge(int age)
像這種方法名稱前面是get和set打頭的規(guī)則的類這種方式叫做JavaBean睬辐,主要用于訪問Java類中的私有字段挠阁。JavaBean的屬性根據(jù)set和get方法名稱來獲知宾肺,如setAge
,屬性就為age
鹃唯,而并不是跟類的成員變量有關爱榕,看不到Java類的內(nèi)部成員。 - 兩個模塊間傳遞多個信息就是用JavaBean的方式坡慌,將這些信息封裝到一個JavaBean中黔酥,這種JavaBean的實例對象稱之為值對象(Value Object)。這些類中用私有字段存儲洪橘,可以用
set
和get
的方法來獲取或者設置這些值跪者。
package com.sergio.NewTecl;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 內(nèi)省的操作
* Created by Sergio on 2015-06-08.
*/
public class JavaBeanDemo1 {
public static void main(String[] args) throws Exception {
JavaBeanTest jbt = new JavaBeanTest(3, 5);
//要獲取的JavaBean屬性X
String propertyName = "x";
//獲取JavaBean信息,get
PropertyDescriptor pd = new PropertyDescriptor(propertyName, jbt.getClass());
Method methodGetX = pd.getReadMethod();
Object objValue = methodGetX.invoke(jbt);
System.out.println(objValue);
//set
Object value = 4;
Method methodSetX = pd.getWriteMethod();
methodGetX.invoke(jbt, value);
System.out.println(jbt.getX());
}
}
class JavaBeanTest {
private int x;
public int y;
JavaBeanTest(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
BeanUtils
- 對JavaBean操作的封裝工具類熄求。
//BeanUtils主要操作的值為字符串
BeanUtils.getProperty(jbt, "x");
BeanUtils.setProperty(jbt, "x", "9");
//Map與BeanUtils的互操作渣玲。BeanUtils為值對象,而Map為鍵值對
Map<String, Integer> map = new HashMap<String, Integer>();
BeanUtils.setProperty(map, "name", "lisi");
//PropertyUtils操作的本身的數(shù)據(jù)類型
PropertyUtils.setProperty(jbt, "x", 9);
注解
- 注解相當于一種標記弟晚,在程序中加了注解就等于為程序打上了某種標記忘衍,javac編譯器,開發(fā)工具和其他程序可以用反射來獲取你寫的類及各種元素上有無標記卿城,根據(jù)獲取到的標記去做相應的工作枚钓。
- 標記可以加在包、類瑟押、字段搀捷、方法,方法的參數(shù)以及局部變量上多望。
- @SuppressWarnings:阻止編譯器的警告嫩舟。@Deprecated:標記某個過時的類或方法。@Override:重載怀偷。
-
注解相當于一個你的源程序中要調(diào)用的一個類家厌,要在源程序中應用某個注解,得先定義這個注解類椎工。就像調(diào)用某個類類似像街,你的先開發(fā)好這個類。
- @Retention元注解:類的保留生命周期階段晋渺。取值為:RetentionPolicy.SOURCE、RetentionPolicy.Class(默認值)脓斩、RetentionPolicy.RUNTIME代表調(diào)用的生命周期木西。分別對應注解三個周期:java源文件->class文件->內(nèi)存中的字節(jié)碼
- @Target元注解:注解的類可以作用在那個成分上(類、方法随静、接口等)八千。
- 注解屬性:注解相當于獨特的類吗讶,而屬性相當于這個類中的方法。定義方式:在注解中增加
String color();
恋捆、@MyAnnotation(color="blue")
- 數(shù)組類型的屬性:int arrayAttr default {2,4};@MyAnnotation(arrayAttr={2,3,4})\如果數(shù)組屬性只有一個元素照皆,這時候?qū)傩灾档牟糠挚梢允÷源罄ㄌ枴?/li>
- 枚舉的屬性:EnumTest1.TrafficLamp lamp();@MyAnnotation(lamp=EnumTest1.TrafficLamp.GREEN)。
- 注解屬性:MetaAnnotation annotationAttr() default 沸停。@MetaAnnotation("2");@AnnotationDemo(annotationAttr = @MetaAnnotation("hz"), color = "red", value = "12", arrayAttr = {2, 3, 4})膜毁。
package com.sergio.NewTecl;
/**
* 注解定義
* Created by Sergio on 2015-06-09.
*/
public @interface MetaAnnotation {
String value();
}
============================
package com.sergio.NewTecl;
/**
* 注解定義
* Created by Sergio on 2015-06-09.
*/
public @interface MetaAnnotation {
String value();
}
=====================
package com.sergio.NewTecl;
/**
* 注解與反射
* Created by Sergio on 2015-06-09.
*/
@AnnotationDemo(annotationAttr = @MetaAnnotation("hz"), color = "red", value = "12", arrayAttr = {2, 3, 4})
public class AnnotationTest {
//阻止編譯器過時API警告
@SuppressWarnings("deprecation")
@AnnotationDemo(value = "23")//此注解color已經(jīng)有了默認值,只需設置value即可
public static void main(String[] args) {
System.runFinalizersOnExit(true);//過期API
if (AnnotationTest.class.isAnnotationPresent(AnnotationDemo.class)) {
AnnotationDemo annotation =
(AnnotationDemo) AnnotationTest.class.getAnnotation(AnnotationDemo.class);
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.annotationAttr().value());
}
}
}
泛型
- JDK1.5出現(xiàn)的新特性愤钾,解決了安全問題瘟滨,是一個類型安全機制。使用泛型集合能颁,可以將一個集合的元素作為特定的類型杂瘸,集合中只能存儲同一個類型的對象,這樣更安全伙菊;獲取對象時败玉,不需要做強制類型轉(zhuǎn)換方便。
- 定義格式:
ArrayList<String> collection = new ArrayList<String>();
镜硕。<>
此符號主要用來定義要確認的類型运翼。 - 去類型化:編譯器生成的集合字節(jié)碼會去掉泛型類型信息。
- 術語:ArrayList<E>泛型類型谦疾、ArrayList<E>中的E稱為類型變量或類型參數(shù)南蹂。
- 泛型兼容性:
Collection<String> c = new Vector();
可以兼容;Collection c = new Vector<String>();
可以兼容念恍。 - 泛型的參數(shù)化類型沒有繼承關系:
Vector<String> v = new Vector<Object>();
錯誤六剥。 -
Collection<?> collection
:此處的?是通配符峰伙,表示任意類型疗疟。 - 泛型通配符上限:
Vector<? extends Number> x = new Vector<Integer>()
,表示通配符的類型是Number或者Number的子類。 - 泛型通配符下限:
Vector<? super Integer> = new Vector<Number>()
,表示通配符類型是Integer或Integer的父類瞳氓。
package com.sergio.NewTecl;
import java.util.ArrayList;
import java.util.Collection;
/**
* 泛型基礎信息介紹
* Created by Sergio on 2015-06-11.
*/
public class GenericDemo {
public static void main(String[] args) throws Exception {
//定義String類型的集合
ArrayList<String> collection1 = new ArrayList<String>();
collection1.add("abc");
System.out.println(collection1.get(0));
ArrayList<Integer> collection2 = new ArrayList<Integer>();
//判斷這兩個對象的的字節(jié)碼是否一樣策彤。結(jié)果是true,說明字節(jié)碼一樣匣摘,編譯器生成的字節(jié)碼會去掉類型信息
System.out.println(collection1.getClass() == collection2.getClass());
//使用反射往集合中添加String字符串內(nèi)容
collection2.getClass().getMethod("add", Object.class).invoke(collection2, "abc");
System.out.println(collection2.get(0));
printCollection(collection2);
}
//打印集合元素店诗。此處的?是通配符音榜,表示任意類型
public static void printCollection(Collection<?> collection) {
for (Object obj : collection) {
System.out.println(obj);
}
}
}
package com.sergio.NewTecl;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 對集合進行迭代
* Created by Sergio on 2015-06-11.
*/
public class GenericDemo1 {
public static void main(String[] args) {
HashMap<String, Integer> aMaps = new HashMap<String, Integer>();
aMaps.put("zhansan", 23);
aMaps.put("lisi", 43);
Set<Map.Entry<String, Integer>> entrySet = aMaps.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey() + ":::" + entry.getValue());
}
}
}
- 異常中使用泛型:
public <T extends Exception> sayException() throws T {
try {
} catch (Exception e) {
throw (T) e;
}
return;
}
泛型類型推斷:
根據(jù)調(diào)用泛型方法時實際傳遞的參數(shù)類型或返回值的類型來對端:
- 當某個類型變量只在整個參數(shù)列表中的所有參數(shù)和返回值的一處被應用了庞瘸,那么根據(jù)調(diào)用方法時該處的實際應用類型來確定,及直接根據(jù)調(diào)用方法時傳遞的參數(shù)類型或返回值來決定泛型參數(shù)的類型赠叼。如:
swap(new String[3], 3,4) -> static <E> void swap(E[] a, int i, int i)
擦囊。 - 當某個類型變量在整個參數(shù)列表中的所有參數(shù)和返回值中的多處被應用了违霞,如果調(diào)用調(diào)用方法時這多處的實際應用類型都對應同一種類型來確定。如:
add(3, 5) -> static <T> T add(T a, T b)
瞬场。 - 當某個類型變量在整個參數(shù)列表中的所有參數(shù)和返回值中的多處被應用了买鸽,如果調(diào)用方法時這多處的實際應用類型對應到了不同的類型,且沒有使用返回值贯被,這時候去多個參數(shù)中的最大交集類型眼五,如下面這句實際對應類型是Number,編譯沒有問題刃榨,只是運行時出問題:
fill(new Integer[3], 3, 5) -> static <T> void fill(T[] a, T v)
弹砚。 - 當某個性類變量在整個參數(shù)列表中的所有參數(shù)和返回值中的多處被應用了,如果調(diào)用方法時這多處的實際應用類型對應到了不同類型枢希,并且使用返回值桌吃,這時候優(yōu)先考慮返回值的類型,例如:這面這句實際對應的類型是Integer苞轿,編譯報告錯誤端仰,將變量x的類型改為Number错沃,則沒有了錯誤闪盔,
int x -(3, 3.5f) -> static <T> T add(T a, T b)
违寞。 - 參數(shù)類型的類型推斷具有傳遞性,下面第一種情況推斷實際參數(shù)類型為Object契邀,編譯沒問題摆寄,而第二種情況則根據(jù)參數(shù)化的Vector類實例類型變量直接確定為String類型,編譯將出現(xiàn)問題:
copy(new Integer[5], new String[5]) -> static <T> void copy(T[] a, T[] b)
坯门。
泛型的類和方法定義
- 泛型類何時定義:當類中操作的引用數(shù)據(jù)類型不確定的時候微饥,可以用泛型來完成擴展。
- 定義泛型類和方法:<public class genericDao<T>{}
public <T> T findByID(int id)
古戴。定義泛型類的類型欠橘,在整個類中有效,如果被方法調(diào)用现恼,那么泛型類的對象明確藥操作的具體類型后肃续,所有操作的類型就已經(jīng)固定了叉袍,為了讓不同方法可以操作不同類型始锚,而且類型還不確定,那么可以將方法定義在方法上喳逛。 - 靜態(tài)方法類型:靜態(tài)方法不可以訪問類型定義的泛型瞧捌,如果靜態(tài)方法操作的數(shù)據(jù)類型不確定,可以將泛型定義在方法上艺配。
public staitc <T> void method(E e){}
- 注意:在對泛型類型進行參數(shù)化時察郁,類型參數(shù)的實例化必須是引用類型,不能是基本類型转唉。當一個變量被聲明為泛型時皮钠,只能被實例變量、方法和內(nèi)部類調(diào)用赠法,而不能被靜態(tài)變量和靜態(tài)方法方法調(diào)用麦轰,因為靜態(tài)成員是被所有參數(shù)化的類型所共享,所以靜態(tài)成員不應該有類級別的類型參數(shù)砖织。
- 泛型接口:
package com.sergio.NewTecl;
/**
* 泛型接口
* Created by Sergio on 2015-06-12.
*/
interface Inter<T> {
void show(T t);
}
//實現(xiàn)接口
class InterImpl<R> implements Inter<R> {
public void show(R r) {
System.out.println("show::" + r);
}
}
類加載器
- 加載類的工具款侵。將.class加載進JVM中然后進行處理。
- Java虛擬機有多個類加載器侧纯,系統(tǒng)默認三個主要類加載器新锈,每個類負責加載特定位置的類:BootStrap、ExtClassLoader眶熬、AppClassLoader妹笆。
- BootStrap:類加載器也是Java類,而必須有一個類加載器不是Java類娜氏,而這正是BootStrap拳缠,嵌入在JVM里。
- ExtClassLoader:主要加載具有父子關系的樹狀組織的對象如繼承關系的類贸弥,加載父級的對象窟坐。
-
AppClassLoader:系統(tǒng)Java類加載器。
類加載器的委托機制
- 當Java虛擬機要加載一個類時绵疲,有那個類加載器加載的情況如下:首先當前線線程的類加載器去加載線程中的第一個類哲鸳;如果類A中引用了類B,Java虛擬機將使用加載類A的類裝載器來加載類B最岗;還可直接調(diào)用ClassLoaderClass()方法來制定某個類加載器去加載某個類帕胆。
- 每個類加載器加載類時,優(yōu)先委托給上級類加載器(如上面提到的BootStrap->ExtClassLoader->AppClassLoader優(yōu)先級從左到右降低)般渡。當所有祖宗類加載器沒有加載到類懒豹,回到發(fā)起者類加載器,還加載不了驯用,就抱ClassNotFoundException異常脸秽。
- 獲取類加載器名字:被加載器類.class.getClassLoader().getClass().getName()
- 自定義類加載器必須要繼承ClassLoader,并且實現(xiàn)
findClass(String name)
方法蝴乔,使用指定的二進制名稱查找類记餐。
代理類
- 為已存在的多個具有相同接口的目標類的各個方法增加一些系統(tǒng)功能,例如:異常處理薇正、日志片酝、計算方法的運行時間囚衔、事務處理等等,這些功能可以通過代理來解決雕沿。編寫一個與目標類具有相同接口的代理類练湿,代理類的每個方法調(diào)用目標類的相同方法,并在調(diào)用方法時加載系統(tǒng)功能的代碼审轮。
目標類:doSomeThing(){
業(yè)務功能代碼
}
代理類:doSomeThing(){
//前置系統(tǒng)功能代碼
目標對象.doSomeThing()
//后置系統(tǒng)功能代碼
}
AOP:系統(tǒng)中存在交叉業(yè)務肥哎,一個交叉業(yè)務就是要切入到系統(tǒng)中的一個方面,交叉業(yè)務的編程問題即為面向方面編程疾渣,而代理就是來處理此問題篡诽。
動態(tài)代理技術:要為系統(tǒng)中各種接口的類增加代理功能,需要太多的代理類榴捡,而這時候可以通過JVM可以在運行期動態(tài)生成出類的字節(jié)碼杈女,而這可以被用作代理類,即為動態(tài)代理類薄疚。如果要動態(tài)生成代理類碧信,而目標類沒有實現(xiàn)接口,可以通過CGLIB第三方類庫來生成街夭,
package com.sergio.NewTecl;
import javax.xml.bind.SchemaOutputResolver;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
/**
* 創(chuàng)建動態(tài)類及查看其構(gòu)造方法和成員方法列表信息
* Created by Sergio on 2015-06-14.
*/
public class ProxyTest {
public static void main(String[] args) throws Exception {
//獲取代理類的字節(jié)碼
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy.getName());
//構(gòu)造方法
Constructor[] constructors = clazzProxy.getConstructors();
for (Constructor constructor : constructors) {
//獲取構(gòu)造方法名稱
String name = constructor.getName();
StringBuilder stringBuilder = new StringBuilder(name);
stringBuilder.append('(');
Class[] clazzParams = constructor.getParameterTypes();
for (Class clazzParam : clazzParams) {
stringBuilder.append(clazzParam.getName()).append(',');
}
if (clazzParams != null && clazzParams.length == 0) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
stringBuilder.append(')');
System.out.println(stringBuilder.toString());
}
//方法
Method[] methods = clazzProxy.getMethods();
for (Method methodor : methods) {
//獲取構(gòu)造方法名稱
String name = methodor.getName();
StringBuilder stringBuilder = new StringBuilder(name);
stringBuilder.append('(');
Class[] clazzParams = methodor.getParameterTypes();
for (Class clazzParam : clazzParams) {
stringBuilder.append(clazzParam.getName()).append(',');
}
if (clazzParams != null && clazzParams.length == 0) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
stringBuilder.append(')');
System.out.println(stringBuilder.toString());
}
System.out.println("開始創(chuàng)建實例對象");
//獲得構(gòu)造方法砰碴,主要是現(xiàn)實InvocationHandler是個接口,調(diào)用處理處理程序
Constructor constructor = clazzProxy.getConstructor(InvocationHandler.class);
//需要實現(xiàn)invocationHandler的接口方法,invoke接受的三個參數(shù)為:代理對象板丽,代理對象的那個方法呈枉,代理對象方法的參數(shù)
class MyInvocationHander1 implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}
//動態(tài)創(chuàng)建代理對象
Collection proxy1 = (Collection) constructor.newInstance(new MyInvocationHander1());
proxy1.clear();//調(diào)用collection中的clear方法
proxy1.size();
//創(chuàng)建實例的第二種寫法
Collection proxy2 = (Collection) constructor.newInstance(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
//動態(tài)創(chuàng)建實例對象第三種寫法,
Collection proxy3 =
(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),
new Class[] {Collection.class},
new InvocationHandler() {
ArrayList target = new ArrayList<>();
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long beginTime = System.currentTimeMillis();
Object retVal = method.invoke(target, args);
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + "所用時間" + (endTime - beginTime));
return retVal;
}
});
proxy3.add("xyz");
proxy3.add("lhm");
System.out.println(proxy3.size());
}
}