Java動態代碼(包含代理模式)


比較C++和java ,前者是編譯成機器碼,只要編譯過就是可執行的了,后者是編譯成java class文件,執行時動態生產java類,所以就有泛型時不能通過設置值就確定了具體的class類型,也有了動態生產可執行的方法和類,這里持續記錄

看這個例子,標紅的部分,其實a已經可以確定就是A的字類MainTest6了,但是編譯過不去的,(可以強轉類型成MainTest6,執行不會報錯),Java的泛型基本就是相當於Object類了。

public class MainTest6 {
public void doTest(){}
static abstract class Human {
protected abstract void sayBye();
}

static class Man extends Human {
protected void sayBye(){
System.out.println("man bye");
}
}

static class Woman extends Human {
protected void sayBye(){
System.out.println("women bye");
}
}

public void sayHello(Human guy) {
System.out.println("hello,guy!");
}

public void sayHello(Man guy) {
System.out.println("hello,gentleman!");
}

public void sayHello(Woman guy) {
System.out.println("hello,lady!");
}

public static void sayHello(Object arg) {
System.out.println("hello Object");
}

/*public static void sayHello(int arg) {
System.out.println("hello int");
}*/

/*public static void sayHello(long arg) {
System.out.println("hello long");
}*/

/*public static void sayHello(Character arg) {
System.out.println("hello Character");
}*/

/*public static void sayHello(char arg) {
System.out.println("hello char");
}*/

public static void sayHello(char ...arg) {
System.out.println("hello char……");
}

public static void sayHello(MainTest6 arg) {
System.out.println("hello Serializable");
}

static class A<T>{
public T a;
public A (T aa){
a = aa;
}
public void printA(){
System.out.println(" a: "+ a.getClass());
}
}


public static void main(String[] args) {
MainTest6 mainTest6 = new MainTest6();
A a = new A<MainTest6>(mainTest6);//使用泛型類才能編譯過去
//a.a.doTest(); 泛型直接使用方法編譯不過去,C++可以編譯過去。
mainTest6.doTest();
a.printA();
Human man = new Man();
Human woman = new Woman();
MainTest6 sr = new MainTest6();
sr.sayHello( man);
sr.sayHello(woman);
sayHello('a');
man.sayBye();
woman.sayBye();
man = new Woman();
man.sayBye();
}
}

---------------------------------

一 JDK動態代理

為了方便理解動態代理 ,我先一句話說明白靜態代理:

就是代理類和被代理類都繼承一個接口,代理類里有個被代理類的field,暴露給外界的時代理類,代理類的每個方法都執行一下代理的邏輯,再調用被代理類。

開始說jdk的動態代理,還是需要一個接口類,就是把原來代碼里直接的 被代理類.方法()的調用方式, 換成了反射方式調用,代碼的編寫上少了許多,不需要每個方法都寫一遍了。

 

 

二 cglib動態生成類來實現代理模式:

public class MainTest5 {
public static void main(String[] args)
{
if (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("before doPrint");
Object o = proxy.invokeSuper(obj, args);
System.out.println("after doPrint");
return o;
}
});
Object o = enhancer.create();
((OOMObject)(o)).doPrint();
((OOMObject)(o)).doPrint2();
}
}
static class OOMObject { //沒有static關鍵字 main方法里會報錯
public void doPrint(){
System.out.println("doPrint");
}
public void doPrint2(){
System.out.println("doPrint2");
}
}
}
執行結果:

 

三 byteCode(javaassist 等) 動態生成類

    dubbo源碼里有javaassist,有空整理下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM