Java Reflection API学习

一、Java Reflection API的测试

package tigers;

import java.lang.reflect.*;
import java.util.*;
import java.sql.*;
import java.io.*;


public class Tiger7 {
 private final String name;
 private transient int id;
 public Tiger7() throws Exception {
  this("aa", 23);
 }
 public Tiger7(String name, int id){
  this.name = name;
  this.id = id;
 }

 public static void main(String[] args) {
  try {
   Class c = Class.forName("tigers.Tiger7");
   showFields(c);
   showConstructors(c);
   showMethods(c);

  } catch (Exception ce) {
   ce.printStackTrace();
  }
 }
 private static void showConstructors(Class c) {
  Constructor[] cons = c.getDeclaredConstructors();
  for (Constructor con : cons) {
   System.out.println("<<<<<<<< " + con + ">>>>>>>>");
  }
 }
 private Tiger7 my_method(String name, int id, Tiger7 t7) throws IOException, SQLException {
  return this;
 }
 private static void showFields(Class c) throws Exception {
  Tiger7 t1 = new Tiger7();
  Field[] fis = c.getDeclaredFields();
  for (Field f : fis) {
   System.out.println("........" + f + "........" +
     ", /ngetModifiers=" + Modifier.toString(f.getModifiers()) +
     ", /ngetName=" + f.getName());  
  }
 }
 private static void showMethods(Class c) throws Exception{
  java.lang.reflect.Method[] mes = c.getDeclaredMethods();
  for (Method m : mes) {
   System.out.println("************** " + m + " **************");
   System.out.println("getDeclaringClass=" + m.getDeclaringClass().getName() +
     ", /ngetExceptionTypes=" + Arrays.toString(m.getExceptionTypes()) +
     ", /ngetGenericExceptionTypes=" + Arrays.toString(m.getGenericExceptionTypes()) +
     ", /ngetParameterTypes=" + Arrays.toString(m.getParameterTypes()) +
     ", /ngetGenericParameterTypes=" + Arrays.toString(m.getGenericParameterTypes()) +
     ", /ngetReturnType=" + m.getReturnType() +
     ", /ngetGenericReturnType=" + m.getGenericReturnType() +
     ", /ngetModifiers=" + Modifier.toString(m.getModifiers()) +
     ", /ngetName=" + m.getName());
  }
 }
}

结果:

 

........private final java.lang.String tigers.Tiger7.name........,
getModifiers=private final,
getName=name
........private transient int tigers.Tiger7.id........,
getModifiers=private transient,
getName=id
<<<<<<<< public tigers.Tiger7(java.lang.String,int)>>>>>>>>
<<<<<<<< public tigers.Tiger7() throws java.lang.Exception>>>>>>>>
************** private static void tigers.Tiger7.showFields(java.lang.Class) throws java.lang.Exception **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[class java.lang.Exception],
getGenericExceptionTypes=[class java.lang.Exception],
getParameterTypes=[class java.lang.Class],
getGenericParameterTypes=[class java.lang.Class],
getReturnType=void,
getGenericReturnType=void,
getModifiers=private static,
getName=showFields
************** private static void tigers.Tiger7.showConstructors(java.lang.Class) **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[],
getGenericExceptionTypes=[],
getParameterTypes=[class java.lang.Class],
getGenericParameterTypes=[class java.lang.Class],
getReturnType=void,
getGenericReturnType=void,
getModifiers=private static,
getName=showConstructors
************** private static void tigers.Tiger7.showMethods(java.lang.Class) throws java.lang.Exception **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[class java.lang.Exception],
getGenericExceptionTypes=[class java.lang.Exception],
getParameterTypes=[class java.lang.Class],
getGenericParameterTypes=[class java.lang.Class],
getReturnType=void,
getGenericReturnType=void,
getModifiers=private static,
getName=showMethods
************** private tigers.Tiger7 tigers.Tiger7.my_method(java.lang.String,int,tigers.Tiger7) throws java.io.IOException,java.sql.SQLException **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[class java.io.IOException, class java.sql.SQLException],
getGenericExceptionTypes=[class java.io.IOException, class java.sql.SQLException],
getParameterTypes=[class java.lang.String, int, class tigers.Tiger7],
getGenericParameterTypes=[class java.lang.String, int, class tigers.Tiger7],
getReturnType=class tigers.Tiger7,
getGenericReturnType=class tigers.Tiger7,
getModifiers=private,
getName=my_method
************** public static void tigers.Tiger7.main(java.lang.String[]) **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[],
getGenericExceptionTypes=[],
getParameterTypes=[class [Ljava.lang.String;],
getGenericParameterTypes=[class [Ljava.lang.String;],
getReturnType=void,
getGenericReturnType=void,
getModifiers=public static,
getName=main

二、利用Java Reflection 动态创建对象数组


package tigers;

import java.lang.reflect.*;


public class Tiger11 {
 private String name;
 public Tiger11(String name) {
  this.name = name;
 }
 public String toString() {
  return "(" + name + ")";
 }
 public static void main(String[] args) {
  try {
   Class c = Class.forName("tigers.Tiger11");
   Object arrays = Array.newInstance(c, 10);
   for (int i = 0; i < 10; i++) {
    Array.set(arrays, i, new Tiger11("bitan" + i));
   }
   Tiger11[] tis = (Tiger11[]) arrays; //强制类型转换
   System.out.println(java.util.Arrays.toString(tis));
   for (int i = 0; i < 10; i++) {
    System.out.println(Array.get(arrays, i));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

 

 

[(bitan0), (bitan1), (bitan2), (bitan3), (bitan4), (bitan5), (bitan6), (bitan7), (bitan8), (bitan9)]
(bitan0)
(bitan1)
(bitan2)
(bitan3)
(bitan4)
(bitan5)
(bitan6)
(bitan7)
(bitan8)
(bitan9)

三、利用Java Reflection创建新实例


package tigers;

import java.lang.reflect.*;


public class Tiger9 {
 private String name;
 private int id;
 public Tiger9(String name, int id) {
  this.name = name;
  this.id = id;
 }
 public String toString() {
  return "[" + name + ", " + id + "]";
 }
 public static void main(String[] args) {
  try {
   Class c = Class.forName("tigers.Tiger9");
   Constructor con = c.getDeclaredConstructor(Class.forName("java.lang.String"), int.class);
   Tiger9 t9 = (Tiger9) con.newInstance("bitan", 25);
   System.out.println(t9);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

结果:

 

[bitan, 25]

四、利用Java Reflection动态获取和改变对象的状态


package tigers;

import java.lang.reflect.*;

public class Tiger10 {
 private int id;
 private String name;
 public Tiger10 (int id, String name) {
  this.id = id;
  this.name = name;
 }
 public String toString() {
  return "[" + name + ", " + id + "]";
 }

 public static void main(String[] args) {
  try {
   Tiger10 t10 = new Tiger10(25, "bitan");
   Class c = Class.forName("tigers.Tiger10");
   Field f = c.getDeclaredField("id");
   Field f2 = c.getDeclaredField("name");
   System.out.println(t10 + " (" + f2.get(t10) + "," + f.getInt(t10) + ")");
   f.setInt(t10, 35);
   f2.set(t10, "helen");
   System.out.println(t10 + " (" + f2.get(t10) + "," + f.getInt(t10) + ")");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

结果:

 

[bitan, 25] (bitan,25)
[helen, 35] (helen,35)
同一个Tiger10对象的字段在运行中被动态改变。

五、利用Java Reflection执行方法


package tigers;

import java.lang.reflect.*;

public class Tiger8 {
 private int doSomething(String name, int id) {
  System.out.println("[" + name + ", " + id + "]");
  return id + 1000;
 }
 

 public static void main(String[] args) {
  try {
   Class c = Class.forName("tigers.Tiger8");
   Method me = c.getDeclaredMethod("doSomething", Class.forName("java.lang.String"), int.class);
   Integer result = (Integer) me.invoke(new Tiger8(), "bitan", 25);
   System.out.println(result.intValue());
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

结果:

 

[bitan, 25]
1025

现在将main()中的getDeclaredMethod()改为getMethod(),结果:

java.lang.NoSuchMethodException: tigers.Tiger8.doSomething(java.lang.String, int)
 at java.lang.Class.getMethod(Class.java:1581)
 at tigers.Tiger8.main(Tiger8.java:27)

这是因为getMethod()不能查找到私有方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值