a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 472|回复: 3

[基础知识] JAVA基础:Java的反射测试代码

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
Java代码   package reflect;( u  L& _' w8 U1 Y# M
  import java.lang.reflect.*;0 E* ]! ~1 y% r8 G
  public class DumpMethods {
% l/ g$ _  m8 P! p0 Q) S0 h. M1 }5 n  private double d;
+ |: l3 n0 h. j1 J# G) v0 d/ \  public static final int i = 37;- l1 |' J; B- R) L5 P& ]3 w
  String s = "testing";  y6 E. v+ d, T: P
  public DumpMethods() {& R% m5 B4 V5 Y0 F
  }
% ~' R6 D! \/ P7 W3 ~; h3 b9 x, y, L* X  protected DumpMethods(int i, double d) {
2 V; j8 f6 h' C% I' [1 }: S  }
8 C+ ]4 [# _8 `1 W  ?% G  public int add(int a, int b) {
5 q% c; n2 ^; w$ W1 l, d; g+ l  return a + b;: V! ~, y+ ^! u/ u9 L
  }# G) V! i' W& j
  public static void main(String args[]) {
, \6 C$ }  @: S' G, h5 p  try {
; v5 {2 Z7 I4 p+ _& S! F/ U, B  Class c = Class.forName("java.lang.String");: ]8 {4 ]3 q8 ]0 R* `6 d
  // 得到指定类java.lang.String拥有的方法,将它们分别列出来。6 O# A0 Y( _! Z/ B6 z* H" y
  Method m[] = c.getDeclaredMethods();& E# T3 M- j* |; E
  for (int i = 0; i < m.length; i++) {
, o' g! _3 P, z" a  Method mthod = m;
! x6 i- f% k8 Z8 |: Q  System.out.println(mthod.getName());// 打印方法名
5 r: V5 C  _, w; t' H: d  System.out.println(mthod.getDeclaringClass());// 打印方法名
, S/ g' H7 d, _! S- I( @  // ...得到参数类型5 N! i3 Z6 L/ M/ ?: C
  Class pvec[] = mthod.getParameterTypes();$ o; I+ H; p% m9 d3 ^: D
  for (int j = 0; j < pvec.length; j++)* `3 o, N0 b% t0 D0 U
  System.out.println("param #" + j + " " + pvec[j]);
' w4 G8 D3 y+ z! }  // ...得到异常类型& L: o* ?" C' p. c8 v( [: [3 _: N
  Class evec[] = mthod.getExceptionTypes();
: |( l: ]6 [% T! i! `  for (int j = 0; j < evec.length; j++)1 F# V& F# ^, l) E
  System.out.println("exc #" + j + " " + evec[j]);
/ l) x& C1 q0 [1 G5 b, w% t" T* y // ...得到返回类型5 V! A9 e- V  `; m
  System.out.println("return type = " + mthod.getReturnType());
% W$ P- U0 e- g- A( l6 x8 D' r2 Z  System.out.println("-----");
! K4 z9 P$ p: P: t+ H/ |! ]; l) B) z  // ...System.out.println(m.toString());//打印方法名6 U2 m# Z- a2 t5 m* G: L( Z* q
: d! f4 r7 {7 N, e( `( u
  }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:Java的反射测试代码

</p>  // 获得指定类java.lang.String的构造方法,将它们分别列出来。
* h& p% H9 l( G1 ^9 }  x" }  Constructor ctorlist[] = c.getDeclaredConstructors();  L' V, ~0 V3 K; |4 h
  for (int i = 0; i < ctorlist.length; i++) {' D; ^2 ~  U/ F' ]) r" R- J& o
  Constructor ct = ctorlist;
/ ~( b8 F2 n8 P) C6 j0 ?  System.out.println("name = " + ct.getName());/ R* u- e# Q- s5 Q! G
  System.out.println("decl class = " + ct.getDeclaringClass());  h/ n2 K9 Q" I- ~9 J& e9 e
  Class pvec[] = ct.getParameterTypes();
8 V- R6 T0 O( ^! _" a5 F5 P  for (int j = 0; j < pvec.length; j++)9 U, n' v" ^' c' s/ g' ?* |' b3 O
  System.out.println("param #" + j + " " + pvec[j]);
% t  X5 |: N0 S; `$ n/ h5 {  Class evec[] = ct.getExceptionTypes();
1 D' J  V/ ?( t+ I& `7 C  for (int j = 0; j < evec.length; j++), m% n% P; T% Q  u
  System.out.println("exc #" + j + " " + evec[j]);) L7 H# n! t4 ]: D) b$ ^! `4 N4 w
  System.out.println("-----");. P' k/ S- I  v9 B+ a( ]  X
  }
/ |" v4 x; y+ B+ y3 E8 {6 i  // 获取当前类中声明的字段(不包括从基类继承来的字段),若替换成c.getFields,则是获得包括从基类继承的所有字段* m- L* {* n5 R) i4 P- i6 ^6 Q
  Field fieldlist[] = c.getDeclaredFields();
0 r6 e5 [  W$ {1 m  for (int i = 0; i < fieldlist.length; i++) {
; A" b2 x6 v1 @( D' ^0 F' o  Field fld = fieldlist;
) _7 g( [# y; u4 I. B  System.out.println("name = " + fld.getName());0 y" _3 i( \3 N0 s6 ]* s- |
  System.out.println("decl class = " + fld.getDeclaringClass());
) B/ ]: ^" y, j  w  G5 U7 }. g  System.out.println("type = " + fld.getType());
! F9 W8 X4 t- ^. X- ]* W  // ...得到修饰符2 Y( @% ?3 n4 I  [
  int mod = fld.getModifiers();" U- E& d: B6 b5 F. v4 g* `* a6 S
  System.out.println("modifiers = " + Modifier.toString(mod));
8 X, n& I: H) V0 _7 ~4 ]  System.out.println("-----");2 H( R. @3 ]3 X
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:29 | 显示全部楼层

JAVA基础:Java的反射测试代码

// 根据方法的名称来执行方法   Class partypes[] = new Class[2];1 F+ Y: E. \. s( F0 J  U7 Z7 |& L0 `
  partypes[0] = Integer.TYPE;( k9 p- y1 K  N* a$ S) m- d
  partypes[1] = Integer.TYPE;
" `) d! h# D) |+ i3 N- g  Method meth = c.getMethod("add", partypes);
0 J6 i( E$ Y- l# D$ Y  // ...实例化
4 w) [; L: u# A, p0 h. B& y7 b' h  DumpMethods methobj = new DumpMethods();
  m5 K2 m0 \$ ], ]# i0 B4 U  Object arglist[] = new Object[2];
7 _& J" h5 g5 L/ a7 B  W. `  arglist[0] = new Integer(37);5 W$ m$ g, h! L* b( a% w
  arglist[1] = new Integer(47);9 k  t# Q2 v/ E
  Object retobj = meth.invoke(methobj, arglist);
3 E! D3 D+ P* u" U9 ?  [  Integer retval = (Integer) retobj;8 `; L7 J9 o3 m" V. N; t2 v: `
  // ...这里应当返回add方法的结果, `, m  Q( Q6 F! z+ a5 m
  System.out.println(retval.intValue());$ c: A& D, u, I* E8 g5 `$ m( T
  /*
. {8 E' n7 c7 b  s: m  * 通过调用构造方法来创建新的对象 根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。; @  g8 f, P5 }' n/ x6 p
  * 使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
  _) L2 m4 t  K0 D1 B5 c  */
# F1 f8 V" u7 G' d# \$ |5 y  Constructor ct = c.getConstructor(partypes);  a$ s" L/ ^+ c8 l' `" k
  Object retobj1 = ct.newInstance(arglist);
' q. _2 q( q0 F+ E# F, K  // 改变字段(域)的值4 o- }% r' E% F( S" K" ~+ n
  Field fld = c.getField("d");
. h: e5 S- L0 o# }6 B8 \  DumpMethods f2obj = new DumpMethods();) y# P! Z. N7 Y3 }; h& \
  System.out.println("d = " + f2obj.d);+ C$ K/ p& m! a- ~0 ^6 f7 {
  // ...改变值 除了setDouble还有其他很多种! f- ]( ^: e- E. F
  fld.setDouble(f2obj, 12.34);
4 s. y. Q. a+ A$ x( n! p9 N! }9 S7 h9 ~: t5 \
  System.out.println("d = " + f2obj.d);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:30 | 显示全部楼层

JAVA基础:Java的反射测试代码

</p>  // 使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋值
% T+ ?' r; v$ C' H& j  Class cls = Class.forName("java.lang.String");& K; L/ }6 g: m& B- b
  Object arr = Array.newInstance(cls, 10);1 @+ i' Q/ a2 p
  Array.set(arr, 5, "this is a test");
, \6 s, B) q7 u/ |  String s = (String) Array.get(arr, 5);
0 r' w4 @) ?+ R* b  |7 A% v7 B  System.out.println(s);
  i8 t" f; h- v2 t# t+ u# v  // 数组的另一个复杂点的例子* N0 e6 u3 ]) t4 O
  /*
+ v3 A# O! G* Z! `  * 例中创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为 37。' f' w) N1 x5 \6 P% `5 {$ n
  * 注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。7 {4 {& v- Z# J
  * 进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。) v/ I+ L- a9 n1 Z- a# W
  * 注意创建数组时的类型是动态的,在编译时并不知道其类型。7 [+ ^# ]: ^0 z) L/ A
  */
# X$ \6 D* R% N% Q; G1 R' D  int dims[] = new int[] { 5, 10, 15 };1 R1 g+ q6 x8 ~1 n; l1 W: C% ^
  Object arr1 = Array.newInstance(Integer.TYPE, dims);
& Z, u9 p: H. q+ W* k" y  Object arrobj = Array.get(arr1, 3);3 e% O) V! e) S  j' z5 @; @
  Class cls1 = arrobj.getClass().getComponentType();4 ?" J, ^) P& r. R) T
  System.out.println(cls1);# G- x$ ?, x2 V$ C. ?
  arrobj = Array.get(arrobj, 5);
6 u( t7 Q: k. e  e8 D  Array.setInt(arrobj, 10, 37);5 g9 ?" G3 ^1 w$ P' |5 `
  int arrcast[][][] = (int[][][]) arr;" S& b- a/ P7 M4 y& E
  System.out.println(arrcast[3][5][10]);
  c9 }5 ^- y9 U) s1 O  } catch (Throwable e) {
+ Q$ B4 `+ E4 V+ q7 y; A1 X  System.err.println(e);
% ~! |  y  t0 @; h+ z+ B  }
2 M4 `- X+ x' W; V- q5 l  }
% M' _2 Z7 I% r+ ?, A& A" N8 G6 Z  }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 13:25 , Processed in 0.260710 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表