版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第208集11注解〔Annotation〕:11內置注解:11第210集13自定義注解,ORM,反射的應用:13自定義注解13ORM〔對象關系映射〕:14第211集15反射的初步:16Bean代碼:16測試代碼:17第212集19利用反射的API,來獲取類的信息:19通過類的模板獲取類的,屬性,方法,構造器,〔有參,無參〕!19反射測試2:21第213集23反射操作注解,反射操作泛型:24操作泛型的代碼如下:24反射效率比擬,以及設置SetAccessible(true)后的效率比照代碼:27操作注解〔Annotation〕的代碼如下:29第214集32動態(tài)編譯:32實例代碼如下:32第215集34動態(tài)調用javaScript代碼:34js代碼如下:36第216集37java語言的動態(tài)性:37javassist入門:37emp類:39第217集40Javassist進階:40API的用法詳解:40第220集46深入類類加載47雙親委托機制:47第221集48自定義類加載器深入:48文件類加載器:48測試類的代碼如下:51網絡類加載器:53第222集56類加載器之加密技術初步:56自定義加密解密類加載器技術展示的代碼如下:56加密類加載器代碼:57解密的類加載器代碼如下:59第223集62線程上下文類加載器:63第224集64內部類技術64內部類的存在意義:64第225集68方法內部類:69匿名內部類:70第226集72GOF23設計模式〔groupoffour〕72第227集74單例模式之雙重檢測鎖實現:75靜態(tài)內部類實現單例模式:76枚舉方式實現單例模式:77第228集78單例模式如何防止反射和反序列化的漏洞!78測試反射和反序列化的漏洞79測試單例的5種情況的效率:81第229集83工廠模式83實現類Audi84實現類Byd84測試類Client01,沒有工廠模式的時候:85添加一個工廠類CarFactory85工廠類也可以這樣86測試類87第230集88工廠模式88汽車接口:88汽車工廠接口:89車的實現類如下:89測試類91增加一個實現類91簡單工廠,工廠方法:92第231集93抽象工廠模式:93接口94汽車工廠接口:96測試代碼:98第232集98建造者模式:99第233-234集104原型模式104淺克隆:104深克隆107測試:108深克隆的另一種實現方式,序列化和反序列化實現身:109測試類111第235集112適配器模式113第238集116橋接模式:116商品類117測試:120使用橋接模式后的測試代碼如下:122第239集122組合模式〔composite〕:123應用場景:123組合模式核心:123使用組合模式,模擬殺毒軟件的架構設計!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結構:158代碼展示如下:158第247集160解釋器模式〔Interpreter〕:161開發(fā)中常見的場景:161第248集162策略模式〔strategy〕:162接口的實現類如下:164第249集167模板方法模式〔templatemethod〕:167第250集169狀態(tài)模式〔State〕:169接口的實現類如下:170測試類:172第251集173觀察者模式〔Observer〕173測試類代碼如下:175第252集176觀察者模式進階〔jdk〕:177測試類179第253集180備忘錄模式〔memento〕180核心:180結構: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正那么對象的應用200第263集202JDBC數據庫的操作:202Mysql的下載:204第264集204Mysql的客戶端軟件Navicat軟件的使用:204Navicat的常見操作,請觀看"三百集"視頻即可。205第265集205mysql數據庫的命令的行操作:205常見的操作如下:206第266集206JDBC技術〔JavaDatabaseConnection〕;207連接數據的代碼如下:207第267集209JDBC技術209第268集211JDBC技術211第269集214JDBC技術214ResultSet結果集的處理:214第270集216JDBC批處理技術:216第271集219JDBC當中事務的概念:219事務的四大特點〔ACID〕220事務隔離級別從低到高:220事務的有關代碼操作如下:220第272集223JDBC技術當中的時間類型2231〕2232〕日期比擬處理223第273集225JDBC之時間類的應用226查某段時間的數據的實現:226字符串--》時間類的轉換:226第274集229JDBC之Clob〔CharactorLargeObject〕文本存儲大數據對象:229-CLOB用于存儲大量的文本數據229Mysql中相關類型如下:229代碼展示如下:229第275集232JDBC之Bloc對象的使用:232關于Blob的代碼演示如下:233第276集236JDBC的總結以封裝:236配置文件的代碼為:236JDBCUtil工具類的代碼:237第277集240ORM〔ObjectRelationshipMapping〕的根本思想:240代碼的展示241第278集243JDBC技術的應用:243封裝到map中的代碼演示如下:243第279集247JDBC技術之將一條記錄封裝的javaBean中247Emp類的封裝代碼如下:248javaBeanDept類的封裝如下:250測試代碼如下:252第280集254SORM〔simpleObjectrelationshipMapping〕的根本思想及框架的結構:254SORM的架構255第281-282集257對SORM進行規(guī)劃設計:257這兩集主要是封裝了Configuration類和TableContext類:258TableContext類:261DBManager類代碼如下:265第283集268SORM的進階:268第284集270SORM進階:270JavaFieldGetSet類271JavaFileUtils類代碼272第286集278SORM進階:278第287集283SORM查詢Query接口的實現類的繼續(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工程的整理導出:336第299集337SORM的測試:337測試的代碼如下:337po類代碼338測試功能的代碼如下:340第300集344SORM的測試的增加344第208集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季208集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構,真正零首付入學】注解〔Annotation〕:內置注解:
@Override對父類的方法重寫:
@Deprecated過時的,廢棄的:
@SuppressWarning鎮(zhèn)壓報警信息package
com.bjsxt.test.annotation;import
java.util.ArrayList;import
java.util.Date;import
java.util.List;/**
*
測試內置注解用法
*
@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培訓機構,真正零首付入學】自定義注解,ORM,反射的應用:自定義注解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〔對象關系映射〕: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培訓機構,真正零首付入學】反射的初步:動態(tài)語言:程序運行時,可以改變程序結構或變量類型,如: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必須要有無參的構造方法! public
User()
{ }}測試代碼:通過反射獲取類的方式展示如下:package
com.bjsxt.test;/**
*
測試各種類型(class,interface,enum,annotation,primitive
type,void)對應的對象的獲取方式
*
@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); //對象是表示或封裝一些數據。一個類被加載后,JVM會創(chuàng)立一個對應該類的Class對象,類的整個結構信息會放到對應的Class對象中。 //這個Class對象就像一面鏡子一樣,通過這面鏡子我可以看到對應類的全部信息。 System.out.println(clazz.hashCode()); Class
clazz2
=
Class.forName(path); //一個類只對應一個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培訓機構,真正零首付入學】利用反射的API,來獲取類的信息:通過類的模板獲取類的,屬性,方法,構造器,〔有參,無參〕!package
com.bjsxt.test;import
java.lang.reflect.Constructor;import
java.lang.reflect.Field;import
java.lang.reflect.Method;/**
*
應用反射的API,獲取類的信息(類的名字、屬性、方法、構造器等)
*
@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); //如果方法有參,那么必須傳遞參數類型對應的class對象 Method
m02
=
clazz.getDeclaredMethod("setUname",
String.class);
for(Method
m:methods){ System.out.println("方法:"+m); } //獲得構造器信息 Constructor[]
constructors
=
clazz.getDeclaredConstructors(); Constructor
c
=
clazz.getDeclaredConstructor(int.class,int.class,String.class); System.out.println("獲得構造器:"+c); for(Constructor
temp:constructors){ System.out.println("構造器:"+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)的操作:構造器、方法、屬性
*
@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調用構造方法,構造對象 User
u
=
clazz.newInstance(); //其實是調用了User的無參構造方法 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調用普通方法 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培訓機構,真正零首付入學】反射操作注解,反射操作泛型:操作泛型的代碼如下: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
{ //獲得指定方法參數泛型信息 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()); //根據獲得的表名、字段的信息,拼出DDL語句,然后,使用JDBC執(zhí)行這個SQL,在數據庫中生成相關的表 }
catch
(Exception
e)
{ e.printStackTrace(); } }}反射效率比擬,以及設置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培訓機構,真正零首付入學】動態(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),然后調用動態(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調用執(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");
//調用加載類的main方法
Method
m
=
c.getMethod("main",String[].class);
m.invoke(null,
(Object)new
String[]{});
//由于可變參數是JDK5.0之后才有。
//m.invoke(null,
(Object)new
String[]{});會編譯成:m.invoke(null,"aa","bb"),就發(fā)生了參數個數不匹配的問題。
//因此,必須要加上(Object)轉型,防止這個問題。
//public
static
void
main(String[]
args)
}
catch
(Exception
e)
{
e.printStackTrace();
} }}第215集尚學堂JAVA最全教程配合JAVA300集視頻課程,一集一個文檔本文檔配合:java300集第一季215集【最新文檔更新請參加尚學堂】【專業(yè)JAVA培訓機構,真正零首付入學】動態(tài)調用javaScript代碼:import
javax.script.ScriptEngineFactory;import
javax.script.ScriptEngineManager;/**
*
測試java中的腳本引擎調用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培訓機構,真正零首付入學】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); //添加構造器 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");
//將上面構造好的類寫入到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培訓機構,真正零首付入學】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());
//獲得接口 } /**
*
測試產生新的方法
*
@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); //通過反射調用新生成的方法 Class
clazz
=
cc.toClass(); Object
obj
=
clazz.newInstance();
//通過調用Emp無參構造器,創(chuàng)立新的Emp對象 Method
method
=
clazz.getDeclaredMethod("add",
int.class,int.class); Object
result
=
method.invoke(obj,
200,300); System.out.println(result); } /**
*
修改已有的方法的信息,修改方法體的內容
*
@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!!!\");"); //通過反射調用新生成的方法 Class
clazz
=
cc.toClass(); Object
obj
=
clazz.newInstance();
//通過調用Emp無參構造器,創(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");
//獲取指定的屬性 //增加相應的set和get方法 cc.addMethod(CtNewMethod.getter("getSalary",
f1));; cc.addMethod(CtNewMethod.getter("setSalary",
f1));; } /**
*
構造方法的操作
*
@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培訓機構,真正零首付入學】深入類類加載引導類加載器〔bootstrapclassloader);擴展類加載器(extensionsclassloader);應用類加載器(applicationclassloader);自定義類加載器(從java.lang.ClassLoader);雙親委托機制:目的是保證了java核心庫的類型平安:package
com.bjsxt.test;/**
*
測試類加載器的層次結構、雙親委托機制
*
@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培訓機構,真正零首付入學】自定義類加載器深入:文件類加載器: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); //應該要先查詢有沒有加載過這個類。如果已經加載,那么直接返回加載好的類。如果沒有,那么加載新的類。 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,可以使用它將流中的數據轉成字節(jié)數組 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()); //引導類加載器 System.out.println(c3.getClassLoader()); //自定義的類加載器 System.out.println(c5.getClassLoader()); //系統(tǒng)默認的類加載器 }}網絡類加載器:package
com.bjsxt.test;import
java.io.ByteArrayOutputStream;import
java.io.FileInputStream;import
java.io.IOException;import
java.io.InputStream;import
.URL;/**
*
網絡類加載器
*
@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); //應該要先查詢有沒有加載過這個類。如果已經加載,那么直接返回加載好的類。如果沒有,那么加載新的類。 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,可以使用它將流中的數據轉成字節(jié)數組 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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度珠寶首飾OEM定制加工合同范本2篇
- 二零二五版網絡安全設備采購合同3篇
- 二零二五版鋼琴經銷商區(qū)域保護與市場拓展合同2篇
- 原材料卸車作業(yè)中最低效率保障合同3篇
- 二零二五年度綠色信貸反擔保保證合同規(guī)范范本3篇
- 基于2025年度戰(zhàn)略規(guī)劃的企業(yè)裁員和解雇合同3篇
- 二零二五版房屋買賣合同范本下載關注合同簽訂中的房產證注銷與手續(xù)辦理3篇
- 二零二五版汽車租賃合同押金退還協(xié)議書3篇
- 二零二五年度房產回購及社區(qū)公共設施建設合同3篇
- 二零二五版道路混凝土鋪設及維修合同3篇
- 第5課《弘揚勞動精神勞模精神工匠精神》第1框《理解勞動精神勞模精神工匠精神》-【中職專用】《職業(yè)道德與法治》同步課堂課件
- 2025美國國防部財年美軍武器裝備采購預算中文版
- 70歲換證三力測試題附答案
- 中華醫(yī)學會利益沖突聲明模板
- 帶你玩轉VR虛擬現實智慧樹知到期末考試答案2024年
- DAM10KW中波發(fā)射機各單元的檢測與調整指導示意圖
- 物業(yè)采購工作總結
- 人教版四年級上冊加減乘除四則混合運算300題及答案
- 組織文化與領導力
- 膠粘性不良改善報告
- 河北省石家莊市橋西區(qū)2023-2024學年九年級上冊期末英語模擬試題(附答案)
評論
0/150
提交評論