尚學堂Java300集第三季_第1頁
尚學堂Java300集第三季_第2頁
尚學堂Java300集第三季_第3頁
尚學堂Java300集第三季_第4頁
尚學堂Java300集第三季_第5頁
已閱讀5頁,還剩253頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論