Java反射的使用

灰太狼 2022-07-16 08:28 269阅读 0赞
  1. 主类:
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. /**
  6. * Created by cuboo on 2016/10/11.
  7. */
  8. public class Main01 {
  9. public static void main(String agrs[]){
  10. Main01 mains = new Main01();
  11. exam01 exam = new exam01();
  12. //获得exam01的对象 方法1 方法2 examC = Class.forName(类路径) 方法3 examC = exam01.class
  13. Class examC = exam.getClass();
  14. // mains.constructor(examC);
  15. // mains.field(examC,exam);
  16. mains.method(examC,exam);
  17. }
  18. private void constructor(Class examC){
  19. //获得所有构造器方法
  20. Constructor[] constructors= examC.getDeclaredConstructors();
  21. //遍历构造方法
  22. for (int i = 0; i < constructors.length ; i++) {
  23. Constructor constrctor = constructors[i];
  24. System.out.println("是否带有可变数量的参数:"+constrctor.isVarArgs());
  25. System.out.println("入口参数类型依次是:");
  26. Class[] parameter = constrctor.getParameterTypes();
  27. for (int j = 0; j < parameter.length; j++) {
  28. System.out.println(" "+parameter[j]);
  29. }
  30. System.out.println("可能抛出的异常值:");
  31. Class[] exception = constrctor.getExceptionTypes();
  32. for (int j = 0; j < exception.length; j++) {
  33. System.out.println(" "+exception[j]);
  34. }
  35. exam01 exam0 = null;
  36. while (exam0 == null){
  37. //如果为privatex对象则抛出异常
  38. try {
  39. if (i == 2){
  40. exam0 = (exam01) constrctor.newInstance();
  41. }else if (i == 1){
  42. exam0 = (exam01) constrctor.newInstance("2个参数的构造方法",2);
  43. }else {
  44. Object[] parameters = new Object[]{new String[]{"1","2","3"}};
  45. exam0 = (exam01) constrctor.newInstance(parameters);
  46. }
  47. }catch (Exception e){
  48. System.out.println("创建对象时抛出异常,下面执行setAccessible()方法");
  49. //设置允许访问
  50. constrctor.setAccessible(true);
  51. }
  52. }
  53. exam0.print();
  54. }
  55. }
  56. private void field(Class examC,exam01 exam){
  57. //获得所有成员变量
  58. Field[] fields = examC.getDeclaredFields();
  59. for (int i = 0; i < fields.length; i++) {
  60. Field field = fields[i];
  61. //获得成员变量名称
  62. System.out.println("名称:"+field.getName());
  63. System.out.println("类型:"+field.getType());
  64. boolean isTurn = true;
  65. while(isTurn){
  66. //如果为private则抛出异常
  67. try{
  68. isTurn = false;
  69. System.out.println("修改前的值:"+field.get(exam));
  70. if (field.getType().equals(int.class)){
  71. field.setInt(exam,100);
  72. }else if (field.getType().equals(float.class)){
  73. field.setFloat(exam,99.99f);
  74. }else {
  75. //设置各种类型的成员变量的值
  76. field.set(exam,"成员变量"+field.getName());
  77. }
  78. System.out.println("修改后的值:"+field.get(exam));
  79. }catch (Exception e){
  80. System.out.println("设置成员变量是出现异常,执行setAccessible方法");
  81. field.setAccessible(true);
  82. isTurn = true;
  83. }
  84. }
  85. }
  86. }
  87. private void method(Class examC,exam01 exam){
  88. //获得所有方法
  89. Method[] methods = examC.getDeclaredMethods();
  90. for (int i = 0; i < methods.length; i++) {
  91. Method method = methods[i];
  92. System.out.println("\n方法名称:"+method.getName());
  93. System.out.println("是否可变参数:"+method.isVarArgs());
  94. System.out.println("入口参数依次为:");
  95. Class[] parameters = method.getParameterTypes();
  96. if (parameters.length == 0){
  97. System.out.println("null");
  98. }
  99. for (int j = 0; j < parameters.length; j++) {
  100. System.out.println(parameters[j]);
  101. }
  102. //获得方法返回值的类型
  103. System.out.println("返回值类型:"+method.getReturnType());
  104. boolean isTurn = true;
  105. while(isTurn){
  106. //如果为private则抛出异常
  107. try{
  108. isTurn = false;
  109. if ("staticMethod".equals(method.getName())){
  110. System.out.println(method.invoke(exam));
  111. }else if ("privateMethod".equals(method.getName())){
  112. System.out.println(method.invoke(exam,100));
  113. }else if ("protectedMethod".equals(method.getName())){
  114. System.out.println(method.invoke(exam,"string",100));
  115. }else if ("publicMethod".equals(method.getName())){
  116. Object[] paras = new Object[]{new String[]{"a","b","c"}};
  117. System.out.println(method.invoke(exam,paras));
  118. }
  119. }catch (Exception e){
  120. System.out.println("设置成员方法是出现异常,执行setAccessible方法");
  121. method.setAccessible(true);
  122. isTurn = true;
  123. }
  124. }
  125. }
  126. }
  127. }
  128. 调用类: /**
  129. * Created by cuboo on 2016/10/10.
  130. */
  131. public class exam01 {
  132. String s;
  133. int i,i2,i3;
  134. private String str;
  135. protected int num;
  136. public float nums;
  137. private exam01(){
  138. }
  139. protected exam01(String s,int i){
  140. this.s = s;
  141. this.i = i;
  142. }
  143. public exam01(String... strings) throws NumberFormatException{
  144. if (strings.length > 0){
  145. i = Integer.valueOf(strings[0]);
  146. }
  147. if (strings.length > 1){
  148. i2 = Integer.valueOf(strings[1]);
  149. }
  150. if (strings.length > 2){
  151. i3 = Integer.valueOf(strings[2]);
  152. }
  153. }
  154. public void print(){
  155. System.out.println("s="+s);
  156. System.out.println("i="+i);
  157. System.out.println("i2="+i2);
  158. System.out.println("i3="+i3);
  159. }
  160. static void staticMethod(){
  161. System.out.println("执行staticMethod方法");
  162. }
  163. private void privateMethod(int i){
  164. System.out.println("执行privateMethod方法"+i);
  165. }
  166. protected void protectedMethod(String s,int i){
  167. System.out.println("执行protectedMethod方法"+s+" "+i);
  168. }
  169. public String publicMethod(String... strings){
  170. System.out.println("执行publicMethod方法");
  171. for (int j = 0; j < strings.length; j++) {
  172. System.out.print(strings[j]+" ");
  173. }
  174. System.out.println();
  175. return null;
  176. }
  177. }

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用JAVA利与弊

    在Java的20周年的纪念日的日子里,让我们来重新温习下Java里面的高级知识,Java肯定希望大家了解她,要不然你跟她天天相濡以沫了这么长时间,让她知道你竟然不了解她,不在乎

    相关 使用

    概述     JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态

    相关 如何提高使用Java效率?

    前言 在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现

    相关 Java深入浅出

    刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 1. 什么是反射? 什么是反射?在官方文档中是这样说的