京東面試java
① 京東面試題 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箞闅捐繘銆