版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第208集11注解〔Annotation〕:11內(nèi)置注解:11第210集13自定義注解,ORM,反射的應(yīng)用:13自定義注解13ORM〔對象關(guān)系映射〕:14第211集15反射的初步:16Bean代碼:16測試代碼:17第212集19利用反射的API,來獲取類的信息:19通過類的模板獲取類的,屬性,方法,構(gòu)造器,〔有參,無參〕!19反射測試2:21第213集23反射操作注解,反射操作泛型:24操作泛型的代碼如下:24反射效率比擬,以及設(shè)置SetAccessible(true)后的效率比照代碼:27操作注解〔Annotation〕的代碼如下:29第214集32動態(tài)編譯:32實例代碼如下:32第215集34動態(tài)調(diào)用javaScript代碼:34js代碼如下:36第216集37java語言的動態(tài)性:37javassist入門:37emp類:39第217集40Javassist進階:40API的用法詳解:40第220集46深入類類加載47雙親委托機制:47第221集48自定義類加載器深入:48文件類加載器:48測試類的代碼如下:51網(wǎng)絡(luò)類加載器:53第222集56類加載器之加密技術(shù)初步:56自定義加密解密類加載器技術(shù)展示的代碼如下:56加密類加載器代碼:57解密的類加載器代碼如下:59第223集62線程上下文類加載器:63第224集64內(nèi)部類技術(shù)64內(nèi)部類的存在意義:64第225集68方法內(nèi)部類:69匿名內(nèi)部類:70第226集72GOF23設(shè)計模式〔groupoffour〕72第227集74單例模式之雙重檢測鎖實現(xiàn):75靜態(tài)內(nèi)部類實現(xiàn)單例模式:76枚舉方式實現(xiàn)單例模式:77第228集78單例模式如何防止反射和反序列化的漏洞!78測試反射和反序列化的漏洞79測試單例的5種情況的效率:81第229集83工廠模式83實現(xiàn)類Audi84實現(xiàn)類Byd84測試類Client01,沒有工廠模式的時候:85添加一個工廠類CarFactory85工廠類也可以這樣86測試類87第230集88工廠模式88汽車接口:88汽車工廠接口:89車的實現(xiàn)類如下:89測試類91增加一個實現(xiàn)類91簡單工廠,工廠方法:92第231集93抽象工廠模式:93接口94汽車工廠接口:96測試代碼:98第232集98建造者模式:99第233-234集104原型模式104淺克?。?04深克隆107測試:108深克隆的另一種實現(xiàn)方式,序列化和反序列化實現(xiàn)身:109測試類111第235集112適配器模式113第238集116橋接模式:116商品類117測試:120使用橋接模式后的測試代碼如下:122第239集122組合模式〔composite〕:123應(yīng)用場景:123組合模式核心:123使用組合模式,模擬殺毒軟件的架構(gòu)設(shè)計!124測試127第240集127裝飾模式〔decorator〕:128代碼的展示如下:129測試代碼如下:132第241集133門面模式〔外觀模式〕:133代碼展示如下:133門面模式的展示代碼如下:135測試代碼:136第242集137享元模式〔FlyWeight〕:137核心:137代碼展示:137測試代碼:140第243集141責任鏈模式〔chainofresponsibility〕:141代碼展示如下:142測試代碼如下:148第244集148迭代器模式〔Iterator〕:149迭代器接口:151測試代碼:152第245集153中介者模式〔Mediator〕:153第246集157命令模式〔command〕:157結(jié)構(gòu):158代碼展示如下:158第247集160解釋器模式〔Interpreter〕:161開發(fā)中常見的場景:161第248集162策略模式〔strategy〕:162接口的實現(xiàn)類如下:164第249集167模板方法模式〔templatemethod〕:167第250集169狀態(tài)模式〔State〕:169接口的實現(xiàn)類如下:170測試類:172第251集173觀察者模式〔Observer〕173測試類代碼如下:175第252集176觀察者模式進階〔jdk〕:177測試類179第253集180備忘錄模式〔memento〕180核心:180結(jié)構(gòu):180備忘點較多時:180測試類:184第254集185正那么表達式根本知識:185根本語法185高級語法185第255集188正那么表達式188第257集190正那么語法之選擇符和分組以及反向引用190第258集191正那么語法7:191第259集192正那么的練習:193常見的正那么的表達式:193第260集194正那么的使用:194第261集195Java程序中如何使用正那么表達式:195正那么對象中分組的處理:197正那么對象的替換操作198正那么對象對分割字符串的操作:199第262集199正那么對象的應(yīng)用200第263集202JDBC數(shù)據(jù)庫的操作:202Mysql的下載:204第264集204Mysql的客戶端軟件Navicat軟件的使用:204Navicat的常見操作,請觀看"三百集"視頻即可。205第265集205mysql數(shù)據(jù)庫的命令的行操作:205常見的操作如下:206第266集206JDBC技術(shù)〔JavaDatabaseConnection〕;207連接數(shù)據(jù)的代碼如下:207第267集209JDBC技術(shù)209第268集211JDBC技術(shù)211第269集214JDBC技術(shù)214ResultSet結(jié)果集的處理:214第270集216JDBC批處理技術(shù):216第271集219JDBC當中事務(wù)的概念:219事務(wù)的四大特點〔ACID〕220事務(wù)隔離級別從低到高:220事務(wù)的有關(guān)代碼操作如下:220第272集223JDBC技術(shù)當中的時間類型2231〕2232〕日期比擬處理223第273集225JDBC之時間類的應(yīng)用226查某段時間的數(shù)據(jù)的實現(xiàn):226字符串--》時間類的轉(zhuǎn)換:226第274集229JDBC之Clob〔CharactorLargeObject〕文本存儲大數(shù)據(jù)對象:229-CLOB用于存儲大量的文本數(shù)據(jù)229Mysql中相關(guān)類型如下:229代碼展示如下:229第275集232JDBC之Bloc對象的使用:232關(guān)于Blob的代碼演示如下:233第276集236JDBC的總結(jié)以封裝:236配置文件的代碼為:236JDBCUtil工具類的代碼:237第277集240ORM〔ObjectRelationshipMapping〕的根本思想:240代碼的展示241第278集243JDBC技術(shù)的應(yīng)用:243封裝到map中的代碼演示如下:243第279集247JDBC技術(shù)之將一條記錄封裝的javaBean中247Emp類的封裝代碼如下:248javaBeanDept類的封裝如下:250測試代碼如下:252第280集254SORM〔simpleObjectrelationshipMapping〕的根本思想及框架的結(jié)構(gòu):254SORM的架構(gòu)255第281-282集257對SORM進行規(guī)劃設(shè)計:257這兩集主要是封裝了Configuration類和TableContext類:258TableContext類:261DBManager類代碼如下:265第283集268SORM的進階:268第284集270SORM進階:270JavaFieldGetSet類271JavaFileUtils類代碼272第286集278SORM進階:278第287集283SORM查詢Query接口的實現(xiàn)類的繼續(xù)封裝:283mysqlQuery類的代碼如下:283reflectUtils類:292第289-290集293SORM進階:293第291-292集302SORM進階:302mysqlQuery當中的querRows方法的封裝:302EmpVo對象的封裝:311第293集313SORM進階:313第294-297集321SORM代碼的優(yōu)化:322Query.類的進一步優(yōu)化:322CallBack類封裝331MySqlQuery的進一步優(yōu)化:332第298集336SORM工程的整理導(dǎo)出:336第299集337SORM的測試:337測試的代碼如下:337po類代碼338測試功能的代碼如下:340第300集344SORM的測試的增加344第208集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季208集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】注解〔Annotation〕:內(nèi)置注解:
@Override對父類的方法重寫:
@Deprecated過時的,廢棄的:
@SuppressWarning鎮(zhèn)壓報警信息package
com.bjsxt.test.annotation;import
java.util.ArrayList;import
java.util.Date;import
java.util.List;/**
*
測試內(nèi)置注解用法
*
@author
尚學堂高淇
*
*/@SuppressWarnings("all")public
class
Demo01
/*extends
Object*/
{ @Override public
String
toString(){ return
""; } @Deprecated public
static
void
test001(){ System.out.println("test001"); } public
static
void
test002(){ List
list
=
new
ArrayList(); List
list2
=
new
ArrayList(); } public
static
void
main(String[]
args)
{ Date
d
=
new
Date(); test001(); }}第210集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季210集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】自定義注解,ORM,反射的應(yīng)用:自定義注解package
com.bjsxt.test.annotation;import
java.lang.annotation.ElementType;import
java.lang.annotation.Retention;import
java.lang.annotation.RetentionPolicy;import
java.lang.annotation.Target;@Target(value={ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public
@interface
SxtTable
{ String
value();}package
com.bjsxt.test.annotation;import
java.lang.annotation.ElementType;import
java.lang.annotation.Retention;import
java.lang.annotation.RetentionPolicy;import
java.lang.annotation.Target;@Target(value={ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public
@interface
SxtField
{ String
columnName(); String
type(); int
length();}ORM〔對象關(guān)系映射〕:package
com.bjsxt.test.annotation;@SxtTable("tb_student")public
class
SxtStudent
{ @SxtField(columnName="id",type="int",length=10) private
int
id; @SxtField(columnName="sname",type="varchar",length=10) private
String
studentName; @SxtField(columnName="age",type="int",length=3) private
int
age; public
int
getId()
{ return
id; } public
void
setId(int
id)
{ this.id
=
id; } public
String
getStudentName()
{ return
studentName; } public
void
setStudentName(String
studentName)
{ this.studentName
=
studentName; } public
int
getAge()
{ return
age; } public
void
setAge(int
age)
{ this.age
=
age; }}第211集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季211集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】反射的初步:動態(tài)語言:程序運行時,可以改變程序結(jié)構(gòu)或變量類型,如:Python,ruby,javascript等等。Bean代碼:package
com.bjsxt.test.bean;public
class
User
{ private
int
id; private
int
age; private
String
uname; public
int
getId()
{ return
id; } public
void
setId(int
id)
{ this.id
=
id; } public
int
getAge()
{ return
age; } public
void
setAge(int
age)
{ this.age
=
age; } public
String
getUname()
{ return
uname; } public
void
setUname(String
uname)
{ this.uname
=
uname; } public
void
setUname()
{ this.uname
=
"高淇"; } public
User(int
id,
int
age,
String
uname)
{ super(); this.id
=
id; this.age
=
age; this.uname
=
uname; } //javabean必須要有無參的構(gòu)造方法! public
User()
{ }}測試代碼:通過反射獲取類的方式展示如下:package
com.bjsxt.test;/**
*
測試各種類型(class,interface,enum,annotation,primitive
type,void)對應(yīng)的對象的獲取方式
*
@author
尚學堂高淇
*
*/@SuppressWarnings("all")public
class
Demo01
{ public
static
void
main(String[]
args)
{ String
path
=
"com.bjsxt.test.bean.User"; try
{ Class
clazz
=
Class.forName(path); //對象是表示或封裝一些數(shù)據(jù)。一個類被加載后,JVM會創(chuàng)立一個對應(yīng)該類的Class對象,類的整個結(jié)構(gòu)信息會放到對應(yīng)的Class對象中。 //這個Class對象就像一面鏡子一樣,通過這面鏡子我可以看到對應(yīng)類的全部信息。 System.out.println(clazz.hashCode()); Class
clazz2
=
Class.forName(path); //一個類只對應(yīng)一個Class對象 System.out.println(clazz2.hashCode()); Class
strClazz
=
String.class; Class
strClazz2
=
path.getClass();
System.out.println(strClazz==strClazz2); Class
intClazz
=int.class; int[]
arr01
=
new
int[10]; int[][]
arr02
=
new
int[30][3]; int[]
arr03
=
new
int[30]; double[]
arr04
=
new
double[10]; System.out.println(arr01.getClass().hashCode()); System.out.println(arr02.getClass().hashCode()); System.out.println(arr03.getClass().hashCode()); System.out.println(arr04.getClass().hashCode()); }
catch
(Exception
e)
{ e.printStackTrace(); } }}第212集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季212集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】利用反射的API,來獲取類的信息:通過類的模板獲取類的,屬性,方法,構(gòu)造器,〔有參,無參〕!package
com.bjsxt.test;import
java.lang.reflect.Constructor;import
java.lang.reflect.Field;import
java.lang.reflect.Method;/**
*
應(yīng)用反射的API,獲取類的信息(類的名字、屬性、方法、構(gòu)造器等)
*
@author
尚學堂高淇
*
*/public
class
Demo02
{ public
static
void
main(String[]
args)
{ String
path
=
"com.bjsxt.test.bean.User"; try
{ Class
clazz
=
Class.forName(path); //獲取類的名字 System.out.println(clazz.getName());//獲得包名+類名: System.out.println(clazz.getSimpleName()); //獲的類名:User //獲取屬性信息// Field[]
fields
=
clazz.getFields();
//只能獲得public的field Field[]
fields
=
clazz.getDeclaredFields();//獲得所有的field Field
f
=
clazz.getDeclaredField("uname"); System.out.println(fields.length); for(Field
temp:fields){ System.out.println("屬性:"+temp); } //獲取方法信息 Method[]
methods
=
clazz.getDeclaredMethods(); Method
m01
=
clazz.getDeclaredMethod("getUname",
null); //如果方法有參,那么必須傳遞參數(shù)類型對應(yīng)的class對象 Method
m02
=
clazz.getDeclaredMethod("setUname",
String.class);
for(Method
m:methods){ System.out.println("方法:"+m); } //獲得構(gòu)造器信息 Constructor[]
constructors
=
clazz.getDeclaredConstructors(); Constructor
c
=
clazz.getDeclaredConstructor(int.class,int.class,String.class); System.out.println("獲得構(gòu)造器:"+c); for(Constructor
temp:constructors){ System.out.println("構(gòu)造器:"+temp); } }
catch
(Exception
e)
{ e.printStackTrace(); } }}反射測試2:package
com.bjsxt.test;import
java.lang.reflect.Constructor;import
java.lang.reflect.Field;import
java.lang.reflect.Method;import
com.bjsxt.test.bean.User;/**
*
通過反射API動態(tài)的操作:構(gòu)造器、方法、屬性
*
@author
尚學堂高淇
*
*/public
class
Demo03
{ public
static
void
main(String[]
args)
{ String
path
=
"com.bjsxt.test.bean.User"; try
{ Class<User>
clazz
=
(Class<User>)
Class.forName(path); //通過反射API調(diào)用構(gòu)造方法,構(gòu)造對象 User
u
=
clazz.newInstance(); //其實是調(diào)用了User的無參構(gòu)造方法 System.out.println(u); Constructor<User>
c
=
clazz.getDeclaredConstructor(int.class,int.class,String.class); User
u2
=
c.newInstance(1001,18,"高淇二"); System.out.println(u2.getUname()); //通過反射API調(diào)用普通方法 User
u3
=
clazz.newInstance(); Method
method
=
clazz.getDeclaredMethod("setUname",
String.class); method.invoke(u3,
"高淇三");
//u3.setUname("高淇三"); System.out.println(u3.getUname()); //通過反射API操作屬性 User
u4
=
clazz.newInstance(); Field
f
=
clazz.getDeclaredField("uname"); f.setAccessible(true);
//這個屬性不需要做平安檢查了,可以直接訪問 f.set(u4,
"高淇四"); //通過反射直接寫屬性 System.out.println(u4.getUname()); //通過反射直接讀屬性的值 System.out.println(f.get(u4)); }
catch
(Exception
e)
{ e.printStackTrace(); } }}第213集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季213集【最新文檔更新請參加尚學堂】[
專業(yè)JAVA培訓機構(gòu),真正零首付入學】反射操作注解,反射操作泛型:操作泛型的代碼如下:package
com.bjsxt.test;import
java.lang.reflect.Method;import
java.lang.reflect.ParameterizedType;import
java.lang.reflect.Type;import
java.util.List;import
java.util.Map;import
com.bjsxt.test.bean.User;/**
*
通過反射獲取泛型信息
*
@author
dell
*
*/public
class
Demo04
{ public
void
test01(Map<String,User>
map,List<User>
list){ System.out.println("Demo04.test01()"); } public
Map<Integer,User>
test02(){ System.out.println("Demo04.test02()"); return
null; } public
static
void
main(String[]
args)
{ try
{ //獲得指定方法參數(shù)泛型信息 Method
m
=
Demo04.class.getMethod("test01",
Map.class,List.class); Type[]
t
=
m.getGenericParameterTypes(); for
(Type
paramType
:
t)
{ System.out.println("#"+paramType); if(paramType
instanceof
ParameterizedType){ Type[]
genericTypes
=
((ParameterizedType)
paramType).getActualTypeArguments(); for
(Type
genericType
:
genericTypes)
{ System.out.println("泛型類型:"+genericType); } } } //獲得指定方法返回值泛型信息 Method
m2
=
Demo04.class.getMethod("test02",
null); Type
returnType
=
m2.getGenericReturnType(); if(returnType
instanceof
ParameterizedType){ Type[]
genericTypes
=
((ParameterizedType)
returnType).getActualTypeArguments(); for
(Type
genericType
:
genericTypes)
{ System.out.println("返回值,泛型類型:"+genericType); } } }
catch
(Exception
e)
{ e.printStackTrace(); } }}package
com.bjsxt.test;import
java.lang.annotation.Annotation;import
java.lang.reflect.Field;import
com.bjsxt.test.annotation.SxtField;import
com.bjsxt.test.annotation.SxtTable;/**
*
通過反射獲取注解信息
*
@author
尚學堂高淇
*
*/public
class
Demo05
{ public
static
void
main(String[]
args)
{ try
{ Class
clazz
=
Class.forName("com.bjsxt.test.annotation.SxtStudent"); //獲得類的所有有效注解 Annotation[]
annotations=clazz.getAnnotations(); for
(Annotation
a
:
annotations)
{ System.out.println(a); } //獲得類的指定的注解 SxtTable
st
=
(SxtTable)
clazz.getAnnotation(SxtTable.class); System.out.println(st.value()); //獲得類的屬性的注解 Field
f
=
clazz.getDeclaredField("studentName"); SxtField
sxtField
=
f.getAnnotation(SxtField.class); System.out.println(sxtField.columnName()+"--"+sxtField.type()+"--"+sxtField.length()); //根據(jù)獲得的表名、字段的信息,拼出DDL語句,然后,使用JDBC執(zhí)行這個SQL,在數(shù)據(jù)庫中生成相關(guān)的表 }
catch
(Exception
e)
{ e.printStackTrace(); } }}反射效率比擬,以及設(shè)置SetAccessible(true)后的效率比照代碼:操作注解〔Annotation〕的代碼如下:package
com.bjsxt.test.annotation;import
java.lang.annotation.ElementType;import
java.lang.annotation.Retention;import
java.lang.annotation.RetentionPolicy;import
java.lang.annotation.Target;@Target(value={ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public
@interface
SxtField
{ String
columnName(); String
type(); int
length();}package
com.bjsxt.test.annotation;@SxtTable("tb_student")public
class
SxtStudent
{ @SxtField(columnName="id",type="int",length=10) private
int
id; @SxtField(columnName="sname",type="varchar",length=10) private
String
studentName; @SxtField(columnName="age",type="int",length=3) private
int
age; public
int
getId()
{ return
id; } public
void
setId(int
id)
{ this.id
=
id; } public
String
getStudentName()
{ return
studentName; } public
void
setStudentName(String
studentName)
{ this.studentName
=
studentName; } public
int
getAge()
{ return
age; } public
void
setAge(int
age)
{ this.age
=
age; }}package
com.bjsxt.test.annotation;import
java.lang.annotation.ElementType;import
java.lang.annotation.Retention;import
java.lang.annotation.RetentionPolicy;import
java.lang.annotation.Target;@Target(value={ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public
@interface
SxtTable
{ String
value();}第214集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季214集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】動態(tài)編譯:實例代碼如下:package
com.bjsxt.test;import
java.lang.reflect.Method;import
.URL;import
.URLClassLoader;import
javax.tools.JavaCompiler;import
javax.tools.ToolProvider;/**
*
測試java的動態(tài)編譯
*
@author
尚學堂高淇
*
*/public
class
Demo01
{ public
static
void
main(String[]
args)
throws
Exception
{ //通過IO流操作,將字符串存儲成一個臨時文件(Hi.java),然后調(diào)用動態(tài)編譯方法! String
str
=
"public
class
Hi
{public
static
void
main(String[]
args){System.out.println(\"HaHa,sxt!\");}}"; JavaCompiler
compiler
=
ToolProvider.getSystemJavaCompiler(); int
result
=
compiler.run(null,
null,
null,
"c:/myjava/HelloWorld.java"); System.out.println(result==0?"編譯成功":"編譯失敗"); //通過Runtime調(diào)用執(zhí)行類// Runtime
run
=
Runtime.getRuntime();
//
Process
process
=
run.exec("java
-cp
c:/myjava
HelloWorld");
////
InputStream
in
=
process.getInputStream();//
BufferedReader
reader
=
new
BufferedReader(new
InputStreamReader(in));// String
info
=
"";// while((info=reader.readLine())!=null){// System.out.println(info);// }
try
{
URL[]
urls
=
new
URL[]
{new
URL("file:/"+"C:/myjava/")};
URLClassLoader
loader
=
new
URLClassLoader(urls);
Class
c
=
loader.loadClass("HelloWorld");
//調(diào)用加載類的main方法
Method
m
=
c.getMethod("main",String[].class);
m.invoke(null,
(Object)new
String[]{});
//由于可變參數(shù)是JDK5.0之后才有。
//m.invoke(null,
(Object)new
String[]{});會編譯成:m.invoke(null,"aa","bb"),就發(fā)生了參數(shù)個數(shù)不匹配的問題。
//因此,必須要加上(Object)轉(zhuǎn)型,防止這個問題。
//public
static
void
main(String[]
args)
}
catch
(Exception
e)
{
e.printStackTrace();
} }}第215集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季215集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】動態(tài)調(diào)用javaScript代碼:import
javax.script.ScriptEngineFactory;import
javax.script.ScriptEngineManager;/**
*
測試java中的腳本引擎調(diào)用javascript腳本
*
*
@author
尚學堂高淇
*
*/ } //執(zhí)行一個js文件(我們將a.js至于工程的src下即可) URL
is
=
Demo02.class.getClassLoader().getResource("a.js"); Reader
r
=
new
FileReader(is.getPath()); engine.eval(r); }}js代碼如下://定義test方法function
test(){ var
a
=
3; var
b
=
4; println("invoke
js
file:"+(a+b));}//執(zhí)行test方法test();第216集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季216集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】java語言的動態(tài)性:
java語言的反射:字節(jié)碼操作:javassist入門:package
com.bjsxt.test;import
javassist.CannotCompileException;import
javassist.ClassPool;import
javassist.CtClass;import
javassist.CtConstructor;import
javassist.CtField;import
javassist.CtMethod;/**
*
測試使用javassist生成一個新的類
*
@author
尚學堂高淇
*
*/public
class
Demo01
{ public
static
void
main(String[]
args)
throws
Exception
{ ClassPool
pool
=
ClassPool.getDefault(); CtClass
cc
=
pool.makeClass("com.bjsxt.bean.Emp"); //創(chuàng)立屬性 CtField
f1
=
CtField.make("private
int
empno;",
cc); CtField
f2
=
CtField.make("private
String
ename;",
cc); cc.addField(f1); cc.addField(f2); //創(chuàng)立方法 CtMethod
m1
=
CtMethod.make("public
int
getEmpno(){return
empno;}",
cc); CtMethod
m2
=
CtMethod.make("public
void
setEmpno(int
empno){this.empno=empno;}",
cc); cc.addMethod(m1); cc.addMethod(m2); //添加構(gòu)造器 CtConstructor
constructor
=
new
CtConstructor(new
CtClass[]{CtCType,pool.get("java.lang.String")},
cc); constructor.setBody("{this.empno=empno;
this.ename=ename;}"); cc.addConstructor(constructor); cc.writeFile("c:/myjava");
//將上面構(gòu)造好的類寫入到c:/myjava中 System.out.println("生成類,成功!"); }}emp類:package
com.bjsxt.test;@Author(name="gaoqi",
year=2023)
public
class
Emp
{ private
int
empno; private
String
ename; public
void
sayHello(int
a){ System.out.println("sayHello,"+a); } public
int
getEmpno()
{ return
empno; } public
void
setEmpno(int
empno)
{ this.empno
=
empno; } public
String
getEname()
{ return
ename; } public
void
setEname(String
ename)
{ this.ename
=
ename; } public
Emp(int
empno,
String
ename)
{ super(); this.empno
=
empno; this.ename
=
ename; } public
Emp()
{ }}第217集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季217集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】Javassist進階:API的用法詳解:package
com.bjsxt.test;import
java.lang.reflect.Method;import
java.util.Arrays;import
javassist.ClassPool;import
javassist.CtClass;import
javassist.CtConstructor;import
javassist.CtField;import
javassist.CtMethod;import
javassist.CtNewMethod;import
javassist.Modifier;import
javassist.NotFoundException;/**
*
測試javassist的API
*
@author
尚學堂高淇
*
*/public
class
Demo02
{ /**
*
處理類的根本用法
*
@throws
Exception
*/ public
static
void
test01()
throws
Exception{ ClassPool
pool
=
ClassPool.getDefault(); CtClass
cc
=
pool.get("com.bjsxt.test.Emp"); byte[]
bytes
=
cc.toBytecode(); System.out.println(Arrays.toString(bytes)); System.out.println(cc.getName());
//獲取類名 System.out.println(cc.getSimpleName());
//獲取簡要類名 System.out.println(cc.getSuperclass());
//獲得父類 System.out.println(cc.getInterfaces());
//獲得接口 } /**
*
測試產(chǎn)生新的方法
*
@throws
Exception
*/ public
static
void
test02()
throws
Exception{ ClassPool
pool
=
ClassPool.getDefault(); CtClass
cc
=
pool.get("com.bjsxt.test.Emp");// CtMethod
m
=
CtNewMethod.make("public
int
add(int
a,int
b){return
a+b;}",
cc); CtMethod
m
=
new
CtMethod(CtCType,"add", new
CtClass[]{CtCType,CtCType},cc); m.setModifiers(Modifier.PUBLIC); m.setBody("{System.out.println(\"sxt\");return
$1+$2;}"); cc.addMethod(m); //通過反射調(diào)用新生成的方法 Class
clazz
=
cc.toClass(); Object
obj
=
clazz.newInstance();
//通過調(diào)用Emp無參構(gòu)造器,創(chuàng)立新的Emp對象 Method
method
=
clazz.getDeclaredMethod("add",
int.class,int.class); Object
result
=
method.invoke(obj,
200,300); System.out.println(result); } /**
*
修改已有的方法的信息,修改方法體的內(nèi)容
*
@throws
Exception
*/ public
static
void
test03()
throws
Exception{ ClassPool
pool
=
ClassPool.getDefault(); CtClass
cc
=
pool.get("com.bjsxt.test.Emp"); CtMethod
cm
=
cc.getDeclaredMethod("sayHello",new
CtClass[]{CtCType}); cm.insertBefore("System.out.println($1);System.out.println(\"start!!!\");"); cm.insertAt(9,
"int
b=3;System.out.println(\"b=\"+b);"); cm.insertAfter("System.out.println(\"end!!!\");"); //通過反射調(diào)用新生成的方法 Class
clazz
=
cc.toClass(); Object
obj
=
clazz.newInstance();
//通過調(diào)用Emp無參構(gòu)造器,創(chuàng)立新的Emp對象 Method
method
=
clazz.getDeclaredMethod("sayHello",
int.class); method.invoke(obj,
300); } /**
*
屬性的操作
*
@throws
Exception
*/ public
static
void
test04()
throws
Exception{ ClassPool
pool
=
ClassPool.getDefault(); CtClass
cc
=
pool.get("com.bjsxt.test.Emp");// CtField
f1
=
CtField.make("private
int
empno;",
cc); CtField
f1
=
new
CtField(CtCType,"salary",cc); f1.setModifiers(Modifier.PRIVATE); cc.addField(f1);// cc.getDeclaredField("ename");
//獲取指定的屬性 //增加相應(yīng)的set和get方法 cc.addMethod(CtNewMethod.getter("getSalary",
f1));; cc.addMethod(CtNewMethod.getter("setSalary",
f1));; } /**
*
構(gòu)造方法的操作
*
@throws
Exception
*/ public
static
void
test05()
throws
Exception
{ ClassPool
pool
=
ClassPool.getDefault(); CtClass
cc
=
pool.get("com.bjsxt.test.Emp"); CtConstructor[]
cs
=
cc.getConstructors(); for
(CtConstructor
c
:
cs)
{ System.out.println(c.getLongName()); } } public
static
void
test06()
throws
Exception{
CtClass
cc
=
ClassPool.getDefault().get("com.bjsxt.test.Emp");
Object[]
all
=
cc.getAnnotations();
Author
a
=
(Author)all[0];
String
name
=
();
int
year
=
a.year();
System.out.println("name:
"
+
name
+
",
year:
"
+
year); } public
static
void
main(String[]
args)
throws
Exception
{ test06(); }}package
com.bjsxt.test;public
@interface
Author
{
String
name();
int
year();
}package
com.bjsxt.test;@Author(name="gaoqi",
year=2023)
public
class
Emp
{ private
int
empno; private
String
ename; public
void
sayHello(int
a){ System.out.println("sayHello,"+a); } public
int
getEmpno()
{ return
empno; } public
void
setEmpno(int
empno)
{ this.empno
=
empno; } public
String
getEname()
{ return
ename; } public
void
setEname(String
ename)
{ this.ename
=
ename; } public
Emp(int
empno,
String
ename)
{ super(); this.empno
=
empno; this.ename
=
ename; } public
Emp()
{ }}第220集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季220集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】深入類類加載引導(dǎo)類加載器〔bootstrapclassloader);擴展類加載器(extensionsclassloader);應(yīng)用類加載器(applicationclassloader);自定義類加載器(從java.lang.ClassLoader);雙親委托機制:目的是保證了java核心庫的類型平安:package
com.bjsxt.test;/**
*
測試類加載器的層次結(jié)構(gòu)、雙親委托機制
*
@author
尚學堂高淇
*
*/public
class
Demo02
{ public
static
void
main(String[]
args)
{ System.out.println(ClassLoader.getSystemClassLoader()); System.out.println(ClassLoader.getSystemClassLoader().getParent()); System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
//JAVA_HOME/jre/lib/rt.jar System.out.println(System.getProperty("java.class.path")); System.out.println("################"); String
a
=
"gaogao"; System.out.println(a.getClass().getClassLoader()); System.out.println(a); }}第221集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季221集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構(gòu),真正零首付入學】自定義類加載器深入:文件類加載器:package
com.bjsxt.test;import
java.io.ByteArrayOutputStream;import
java.io.FileInputStream;import
java.io.IOException;import
java.io.InputStream;/**
*
自定義文件系統(tǒng)類加載器
*
@author
尚學堂高淇
*
*/public
class
FileSystemClassLoader
extends
ClassLoader
{ //com.bjsxt.test.User
-->
d:/myjava/
com/bjsxt/test/User.class
private
String
rootDir; public
FileSystemClassLoader(String
rootDir){ this.rootDir
=
rootDir; } @Override protected
Class<?>
findClass(String
name)
throws
ClassNotFoundException
{ Class<?>
c
=
findLoadedClass(name); //應(yīng)該要先查詢有沒有加載過這個類。如果已經(jīng)加載,那么直接返回加載好的類。如果沒有,那么加載新的類。 if(c!=null){ return
c; }else{ ClassLoader
parent
=
this.getParent(); try
{ c
=
parent.loadClass(name);
//委派給父類加載 }
catch
(Exception
e)
{// e.printStackTrace(); } if(c!=null){ return
c; }else{ byte[]
classData
=
getClassData(name); if(classData==null){ throw
new
ClassNotFoundException(); }else{ c
=
defineClass(name,
classData,
0,classData.length); } } } return
c; } private
byte[]
getClassData(String
classname){
//com.bjsxt.test.User
d:/myjava/
com/bjsxt/test/User.class String
path
=
rootDir
+"/"+
classname.replace('.',
'/')+".class";// IOUtils,可以使用它將流中的數(shù)據(jù)轉(zhuǎn)成字節(jié)數(shù)組 InputStream
is
=
null; ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream(); try{ is
=
new
FileInputStream(path); byte[]
buffer
=
new
byte[1024]; int
temp=0; while((temp=is.read(buffer))!=-1){ baos.write(buffer,
0,
temp); } return
baos.toByteArray(); }catch(Exception
e){ e.printStackTrace(); return
null; }finally{ try
{ if(is!=null){ is.close(); } }
catch
(IOException
e)
{ e.printStackTrace(); } try
{ if(baos!=null){ baos.close(); } }
catch
(IOException
e)
{ e.printStackTrace(); } } }}測試類的代碼如下:package
com.bjsxt.test;/**
*
測試自定義的FileSystemClassLoader
*
@author
尚學堂高淇
*
*/public
class
Demo03
{ public
static
void
main(String[]
args)
throws
Exception{ FileSystemClassLoader
loader
=
new
FileSystemClassLoader("d:/myjava"); FileSystemClassLoader
loader2
=
new
FileSystemClassLoader("d:/myjava"); Class<?>
c
=
loader.loadClass("com.bjsxt.gaoqi.HelloWorld"); Class<?>
c2
=
loader.loadClass("com.bjsxt.gaoqi.HelloWorld"); Class<?>
c3
=
loader2.loadClass("com.bjsxt.gaoqi.HelloWorld"); Class<?>
c4
=
loader2.loadClass("java.lang.String"); Class<?>
c5
=
loader2.loadClass("com.bjsxt.test.Demo01"); System.out.println(c.hashCode()); System.out.println(c2.hashCode()); System.out.println(c3.hashCode()); //同一個類,被不同的加載器加載,JVM認為也是不相同的類 System.out.println(c4.hashCode()); System.out.println(c4.getClassLoader()); //引導(dǎo)類加載器 System.out.println(c3.getClassLoader()); //自定義的類加載器 System.out.println(c5.getClassLoader()); //系統(tǒng)默認的類加載器 }}網(wǎng)絡(luò)類加載器:package
com.bjsxt.test;import
java.io.ByteArrayOutputStream;import
java.io.FileInputStream;import
java.io.IOException;import
java.io.InputStream;import
.URL;/**
*
網(wǎng)絡(luò)類加載器
*
@author
尚學堂高淇
*
*/public
class
NetClassLoader
extends
ClassLoader
{ //com.bjsxt.test.User
-->
sxt/myjava/
com/bjsxt/test/User.class
private
String
rootUrl; public
NetClassLoader(String
rootUrl){ this.rootUrl
=
rootUrl; } @Override protected
Class<?>
findClass(String
name)
throws
ClassNotFoundException
{ Class<?>
c
=
findLoadedClass(name); //應(yīng)該要先查詢有沒有加載過這個類。如果已經(jīng)加載,那么直接返回加載好的類。如果沒有,那么加載新的類。 if(c!=null){ return
c; }else{ ClassLoader
parent
=
this.getParent(); try
{ c
=
parent.loadClass(name);
//委派給父類加載 }
catch
(Exception
e)
{// e.printStackTrace(); } if(c!=null){ return
c; }else{ byte[]
classData
=
getClassData(name); if(classData==null){ throw
new
ClassNotFoundException(); }else{ c
=
defineClass(name,
classData,
0,classData.length); } } } return
c; } private
byte[]
getClassData(String
classname){
//com.bjsxt.test.User
d:/myjava/
com/bjsxt/test/User.class String
path
=
rootUrl
+"/"+
classname.replace('.',
'/')+".class";// IOUtils,可以使用它將流中的數(shù)據(jù)轉(zhuǎn)成字節(jié)數(shù)組 InputStream
is
=
null; ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream(); try{ URL
url
=
new
URL(path); is
=
url.openStream(); byte[]
buffer
=
new
byte[1024]; int
temp=0; while((temp=is.read(buffer))!=-1){ baos.write(buffer,
0,
temp); } return
baos.toByteArray(); }catch(Exception
e){ e.p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手摩托車買賣合同范本
- 上海市保障性住房買賣合同示例
- 個人消費借款抵押擔保合同
- 交通事故責任劃分合同協(xié)議
- 個人資產(chǎn)轉(zhuǎn)讓合同范例
- 交通銀行外匯融資合同樣本
- 中小學學生校園意外傷害賠償合同范本
- 國內(nèi)運輸代理合同模板
- 銷售保健品合同范本
- 設(shè)備試用協(xié)議合同
- 地 理探究與實踐 保護世界文化遺產(chǎn)課件 2024-2025學年地理湘教版七年級上冊
- 內(nèi)燃機車鉗工(中級)職業(yè)鑒定理論考試題及答案
- 長期處方管理規(guī)范-學習課件
- 高中英語外研版 單詞表 選擇性必修3
- 2024年人教版小學六年級數(shù)學(上冊)期末試卷附答案
- 2024-2025學年江蘇省南京鼓樓區(qū)五校聯(lián)考中考模擬物理試題含解析
- 標準作文稿紙模板(A4紙)
- 中小學校園突發(fā)事件應(yīng)急與急救處理課件
- 2024年山東省普通高中學業(yè)水平等級考試生物真題試卷(含答案)
- 2024年青海省西寧市選調(diào)生考試(公共基礎(chǔ)知識)綜合能力題庫匯編
- 2024年湖南高速鐵路職業(yè)技術(shù)學院單招職業(yè)技能測試題庫及答案解析
評論
0/150
提交評論