程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【JVM】2、關於jdk7的MethodHandle類,jdk7methodhandle

【JVM】2、關於jdk7的MethodHandle類,jdk7methodhandle

編輯:JAVA綜合教程

【JVM】2、關於jdk7的MethodHandle類,jdk7methodhandle


關於MethodHandle類,這個類是在jdk1.7之後加入的,這個類的作用類似函數指針的意思

 

這個類中有一個方法

 

 

 

這裡我的jdk有一個問題,就是我在進行MethodHandle操作的時候,我們會發現我們的方法只能設定想要的返回值和參數,但是我們相應的方法裡面卻不能對這些方法進行操作,參數能操作的int類型的會報錯,char也會報錯

 

但是double類型不會出錯

 

 1 package ch08.MethodHandle;
 2 
 3 import java.lang.invoke.MethodHandle;
 4 import java.lang.invoke.MethodType;
 5 
 6 import static java.lang.invoke.MethodHandles.lookup;
 7 
 8 /**
 9  * 
10  * 功能:測試使用MethodHandleTest這個類 
11  * 時間:上午9:49:16 
12  * 文件:MethodHandleTest.java
13  * 
14  * @author Administrator
15  *
16  */
17 public class MethodHandleTest
18 {
19     static class ClassA
20     {
21         public void println(String s)
22         {
23             System.out.println(s);
24         }
25         
26         public void xixi(char g)
27         {
28             System.out.println("zheli shi gg" + g);
29             
30             char a = 'a';
31             a = g;
32             
33             //以下片段加上就會報錯!!!!
34 //            int a = 1;
35 //            a = a + g;
36             //char s = (char) ('a' + g);
37 //            return s;
38         }
39     }
40 
41     public static void main(String[] args) throws Throwable
42     {
43         Object obj = System.currentTimeMillis() % 2 == 0 ? System.out : new ClassA();
44 
45         // 這個方法調用的結果是不論實際類型是那種,最終都可以實現對應的操作
46         //getPrintlnMH(obj).invokeExact("aksdjadj");
47         
48         getPrintXixi(obj).invokeExact(3.25);
49     }
50     
51     private static MethodHandle getPrintXixi(Object clazz) throws NoSuchMethodException, IllegalAccessException
52     {
53         MethodType mt = MethodType.methodType(void.class, char.class);
54         
55         return lookup().findVirtual(clazz.getClass(), "xixi", mt).bindTo(clazz);
56     }
57 
58     private static MethodHandle getPrintlnMH(Object reveiver) throws Throwable
59     {
60         // 這個是方法類型,第一個參數是返回類型,第二個參數是我們的參數類型,後面還有可以有其他的類型
61         MethodType mt = MethodType.methodType(void.class, String.class);
62 
63         // 這個lookup方法中find是用來查找我們制定的類裡面時候含有這個println這個類和相對應的方法類型,然後我們的bindto是返回這個方法的MethodHandle句柄
64         return lookup().findVirtual(reveiver.getClass(), "println", mt).bindTo(reveiver);
65     }
66 }

 

報錯還根據我麼執行的次數不同有差異!!!!

 

 

我們再看看這個

 

 1 package ch08.MethodHandle;
 2 
 3 import java.lang.invoke.MethodHandle;
 4 import java.lang.invoke.MethodType;
 5 
 6 import static java.lang.invoke.MethodHandles.lookup;
 7 
 8 /**
 9  * 
10  * 功能:測試使用MethodHandleTest這個類 
11  * 時間:上午9:49:16 
12  * 文件:MethodHandleTest.java
13  * 
14  * @author Administrator
15  *
16  */
17 public class MethodHandleTest
18 {
19     static class ClassA
20     {
21         public void println(String s)
22         {
23             System.out.println(s);
24         }
25         
26         public void xixi(char g)
27         {
28             System.out.println("zheli shi gg" + g);
29             
30             char a = 'a';
31             a = g;
32             
33             //以下片段加上就會報錯!!!!
34 //            int a = 1;
35 //            a = a + g;
36             //char s = (char) ('a' + g);
37 //            return s;
38         }
39         
40         public void xixi(double g)
41         {
42             
43             double a = 2.565;
44             
45             a += g;
46             
47             //好吧,如果上面這句沒有進程輸出的話,那麼就會在下一句爆粗,無法輸出!!!!
48             System.out.println("zheli shi gg" + g);
49             System.out.println("zheli shi gg" + a);
50             
51             //以下片段加上就會報錯!!!!
52 //            int a = 1;
53 //            a = a + g;
54             //char s = (char) ('a' + g);
55 //            return s;
56         }
57     }
58 
59     public static void main(String[] args) throws Throwable
60     {
61         Object obj = System.currentTimeMillis() % 2 == 0 ? System.out : new ClassA();
62 
63         // 這個方法調用的結果是不論實際類型是那種,最終都可以實現對應的操作
64         //getPrintlnMH(obj).invokeExact("aksdjadj");
65         
66         getPrintXixi(obj).invokeExact(3.25);
67     }
68     
69     private static MethodHandle getPrintXixi(Object clazz) throws NoSuchMethodException, IllegalAccessException
70     {
71 //        MethodType mt = MethodType.methodType(void.class, char.class);
72         MethodType mt = MethodType.methodType(void.class, double.class);
73         
74         return lookup().findVirtual(clazz.getClass(), "xixi", mt).bindTo(clazz);
75     }
76 
77     private static MethodHandle getPrintlnMH(Object reveiver) throws Throwable
78     {
79         // 這個是方法類型,第一個參數是返回類型,第二個參數是我們的參數類型,後面還有可以有其他的類型
80         MethodType mt = MethodType.methodType(void.class, String.class);
81 
82         // 這個lookup方法中find是用來查找我們制定的類裡面時候含有這個println這個類和相對應的方法類型,然後我們的bindto是返回這個方法的MethodHandle句柄
83         return lookup().findVirtual(reveiver.getClass(), "println", mt).bindTo(reveiver);
84     }
85 }

當我們的類型是double類型的時候

 

 

我們得到了相應的輸出,如果是int類型的話,那麼就會報錯,提示找不到相應的方法

而且我們吧兩句輸出中的上面一個去掉的話那麼也會報錯!!!!

 

具體原因是什麼還沒有得到確切的答案!!!!

如有知道,還望告知。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved