比較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,有空整理下。