當前位置:首頁 » 編程語言 » 京東面試java

京東面試java

發布時間: 2024-06-12 11:29:54

① 京東面試題 java 動態代理主要怎麼實現的

在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對介面的的實現。

其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler介面。

Proxy
類主要用來獲取動態代理對象,InvocationHandler介面用來約束調用者實現,如下,HelloWorld介面定義的業務方
法,HelloWorldImpl是HelloWorld介面的實現,HelloWorldHandler是InvocationHandler介面實
現。代碼如下:

業務介面:

public interface HelloWorld {

void sayHelloWorld() ;

}

業務介面實現:

public class HelloWorldImpl implements HelloWorld {

public void sayHelloWorld() {

System.out.println("Hello World!");

}

}

InvocationHandler實現,需要在介面方法調用前後加入一部份處理工作,這里僅僅在方法調用前後向後台輸出兩句字元串,其代碼如下:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

//要代理的原始對象

private Object objOriginal;

/**

* 構造函數。

* @param obj 要代理的原始對象。

*/

public HelloWorldHandler(Object obj) {

this.objOriginal = obj ;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result ;

//方法調用之前

doBefore();

//調用原始對象的方法

result = method.invoke(this.objOriginal ,args);

//方法調用之後

doAfter();

return result ;

}

private void doBefore() {

System.out.println("before method invoke!");

}

private void doAfter() {

System.out.println("after method invoke!");

}

}

測試代碼:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {

HelloWorld hw = new HelloWorldImpl();

InvocationHandler handler = new HelloWorldHandler(hw);

HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

hw.getClass().getClassLoader(),

hw.getClass().getInterfaces(),

handler);

proxy.sayHelloWorld();

}

}

?? 首先獲取一個業務介面的實現對象;

?? 獲取一個InvocationHandler實現,此處是HelloWorldHandler對象;

?? 創建動態代理對象;

?? 通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前後輸出兩句字元串。

運行測試類輸出如下:

before method invoke!

Hello World!

after method invoke!

此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP

② 浜涓渏ava涓闈㈠拰浜岄潰璇曚竴璧風殑鍚

銆銆涓嶄細涓璧風殑錛屼竴鑸闈㈣瘯絎涓嬈¢潰璇曚笌絎浜屾¢潰璇曢兘鏄鏈夋椂闂撮棿闅旂殑銆備絾涓鑸鎯呭喌涓嬶紝絎浜屾¢潰璇曞彧鏄鎺ㄨ緸鐨勮存硶錛屽苟涓嶄細榪涜岀浜屾¢潰璇曘

③ 京東商城的筆試題:用java語言列印出a,b,c,d的所有可能組合……求指點……

abcd都要用上?長度為4?
如果是這樣,那代碼如下,其中心思想就是遞歸

import java.util.ArrayList;
import java.util.List;

public class Permutation {

private char initial;
private char last;
List<Character> chars=new ArrayList<Character>();

public static void main(String[] args) {
new Permutation('a','d').start();
}

public Permutation(char initial,char last) {
this.initial=initial;
this.last=last;
for (char c = this.initial; c <= this.last; c++) {
chars.add(c);
}
}

public void start(){
next(chars,new ArrayList<Character>());
}

private void next(List<Character> unused,List<Character> used){
if(unused.isEmpty()){
System.out.println(used);
}else{
for(int i=0;i<unused.size();i++){
List<Character> cur=new ArrayList<Character>(unused);
List<Character> curUsed=new ArrayList<Character>(used);
curUsed.add(cur.remove(i));
next(cur,curUsed);
}
}
}

}

如果你想長度不固定,就是會出現abc,dc,c這樣的
只需修改next函數
private void next(List<Character> unused,List<Character> used){
if(!unused.isEmpty()){
for(int i=0;i<unused.size();i++){
List<Character> cur=new ArrayList<Character>(unused);
List<Character> curUsed=new ArrayList<Character>(used);
curUsed.add(cur.remove(i));
System.out.println(curUsed);
next(cur,curUsed);
}
}
}
沒有仔細驗證,有什麼問題可以交流 ,格式我沒有改,你可以自己做個輸出函數去遍歷輸出List即可

④ 浜涓渏ava濂介潰璇曞悧

鎵璋撴湁楹濊嚜鐒墮欙紝鍙瑕佹湁瀹炲姏錛屾儏鍟嗕笉澶閭d箞宸錛屽ソ鍏鍙告病閭d箞闅捐繘銆

熱點內容
基因密碼編譯生物 發布:2024-11-27 01:16:23 瀏覽:244
演算法spj 發布:2024-11-27 01:12:02 瀏覽:290
小區密碼八位一般是多少 發布:2024-11-27 01:07:20 瀏覽:626
調試編譯七段數碼管源程序 發布:2024-11-27 01:02:32 瀏覽:159
賬號注冊源碼 發布:2024-11-27 00:51:26 瀏覽:9
添銳壓縮機 發布:2024-11-27 00:46:45 瀏覽:618
別克s60和君威配置哪個好 發布:2024-11-27 00:36:03 瀏覽:722
資料庫的文件名稱 發布:2024-11-27 00:30:04 瀏覽:336
javaweb與android交互 發布:2024-11-27 00:28:26 瀏覽:918
華為手機方舟編譯器emui91 發布:2024-11-27 00:10:46 瀏覽:948