Java 创建动态类和查看方法列表信息的实例

时间:2022-11-17 18:36:36

 Java 创建动态类和查看方法列表信息的实例

Sample code :

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
 
public class ProxyTest {
 
  public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
    System.out.println(clazzProxy);
    System.out.println("------constructor method list ------");
    Constructor[] constructors = clazzProxy.getConstructors();
    for(Constructor constructor:constructors){
      StringBuilder sb = new StringBuilder(constructor.getName());
      sb.append("(");
      Type[] parameterTypes = constructor.getParameterTypes();
      for(Type parameterType:parameterTypes){
        sb.append(parameterType.toString()+",");
      }
      if(parameterTypes.length>0){
        sb.deleteCharAt(sb.length()-1);
      }
      sb.append(")");
      System.out.println(sb.toString());
       
    }
    System.out.println("------constructor method list ------\n\n");
     
    System.out.println("------ method list ------");
    Method[] methods = clazzProxy.getMethods();
    for(Method method:methods){
      StringBuilder sb2 = new StringBuilder(method.getName());
      sb2.append("(");
      Type[] parameterTypes = method.getParameterTypes();
      for(Type parameterType:parameterTypes){
        sb2.append(parameterType.toString()+",");
      }
      if(parameterTypes.length>0){
        sb2.deleteCharAt(sb2.length()-1);
      }
      sb2.append(")");
      System.out.println(sb2.toString());
       
    }
    System.out.println("------ method list ------");
     
    Constructor proxyConstructor = clazzProxy.getConstructor(InvocationHandler.class);
    class MyInvocationHandler implements InvocationHandler{
      ArrayList target = new ArrayList();
      public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable {
        Object obj = method.invoke(target, args);
        return obj;
      }
       
    }
    MyInvocationHandler mih = new MyInvocationHandler();
    Collection collectionProxy = (Collection) proxyConstructor.newInstance(mih);
    collectionProxy.add("zhuang");
    collectionProxy.add("alex");
    System.out.println("collectionProxy size:"+collectionProxy.size());
     
    Collection collectionProxy2 = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),new Class[] {Collection.class},new InvocationHandler(){
      ArrayList target = new ArrayList();
      public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable {
        Object obj = method.invoke(target, args);
        return obj;
      }
    });
     
    collectionProxy2.add("one");
    collectionProxy2.add("two");
    collectionProxy2.add("three");
    System.out.println("collectionProxy2 size:"+collectionProxy2.size());
  }

运行结果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class $Proxy0
------constructor method list ------
$Proxy0(interface Java.lang.reflect.InvocationHandler)
------constructor method list ------
 
 
------ method list ------
add(class java.lang.Object)
hashCode()
equals(class java.lang.Object)
clear()
toString()
contains(class java.lang.Object)
isEmpty()
addAll(interface java.util.Collection)
iterator()
size()
toArray(class [Ljava.lang.Object;)
toArray()
remove(class java.lang.Object)
containsAll(interface java.util.Collection)
removeAll(interface java.util.Collection)
retainAll(interface java.util.Collection)
isProxyClass(class java.lang.Class)
getProxyClass(class java.lang.ClassLoader,class [Ljava.lang.Class;)
newProxyInstance(class java.lang.ClassLoader,class [Ljava.lang.Class;,interface java.lang.reflect.InvocationHandler)
getInvocationHandler(class java.lang.Object)
wait()
wait(long,int)
wait(long)
getClass()
notify()
notifyAll()
------ method list ------
collectionProxy size:2
collectionProxy2 size:3

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!