疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中反射技术点记录


 

为了避免遗忘,将Reflect中常用方法和步骤记录下来。
测试所用的person类如下:
package neuq.test;

public class Person {
 private String name;
 private int age;
 
 public Person(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }
 public Person(){
  super();
 }
 public static void staticMethod(){
  System.out.println("staticMethod run!!"); 
 };
 
 public void paramMethod(String name,int age){
  System.out.println(name+"--------"+age);
 }
 public void noParamMethod(){
  System.out.println("noParamMethod run!!!!");
 }
}

2.JUnit测试代码如下:
package neuq.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class ReflectTest {
 
 /*
  * 测试拿到Class的三种方法
  * 
  */
 @Test
 public void testGetClass() throws ClassNotFoundException{
  //方法一:一般不用
  Person p=new Person();
  Class c1=p.getClass();
  //方法二:很少用
  Class c2=Person.class;
  //方法三:常用
  String className="neuq.test.Person";
  Class c3=Class.forName(className);
  
  System.out.println(c1);
  System.out.println(c2);
  System.out.println(c3);
 }
 
 /*
  * 测试通过指定的构造器实例化对象。
  *
  */
 
 @Test
 public void testGetSpecifiedConstructor() throws
 ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,
 IllegalAccessException, IllegalArgumentException, InvocationTargetException{
  //通过类名拿到Class
  String className="neuq.test.Person";
  Class clazz=Class.forName(className);
  //通过Class对象拿到Constructor,并制定参数类型。
  Constructor constructor=clazz.getConstructor(String.class,int.class);
  //通过Constructor实例化对象。
  Person p=(Person) constructor.newInstance("Dean",20);
  
  System.out.println(p);
 }
 
 
 /*
  * 测试反射字段的方法&以及暴力访问
  * 
  */
  @Test
  public void testGetField() throws Exception{
   //首先拿到Class对象,并实例化
   String className="neuq.test.Person";
   Class clazz=Class.forName(className);
   Constructor constructor=clazz.getConstructor(String.class,int.class);
   Object obj= constructor.newInstance("Dean",20);
   
   /*
    * 拿到字段,并设置值
    * 私有属性只能根据getDeclaredXXX()拿到。否则会出NoSuchXXX异常
    */
   Field field=clazz.getDeclaredField("name");
   String value="Sam";
   
   //暴力访问私有属性,设置可访问性。
   field.setAccessible(true);
   field.set(obj, value);
 }
  
  
  
  /*
   *测试反射 静态方法 带参数的方法 不带参数的方法
   * @ staticMethod()
   * @ paramMethod()
   * @ noParamMethod()
   */
  @Test
  public void testGetMethod() throws Exception{
   //先拿到Class的对象
   String className="neuq.test.Person";
   Class clazz=Class.forName(className);
   Constructor constructor=clazz.getConstructor(String.class,int.class);
   Object obj=constructor.newInstance("Dean",20);
   
   //先测试静态方法,不需要实例化对象
   Method method1=clazz.getMethod("staticMethod");
   method1.invoke(null, null);
   
   //测试无参数方法,需要实例化对象,不需要指定参数
   Method method2=clazz.getMethod("noParamMethod");
   method2.invoke(obj, null);
   
   //测试带参数方法,需要实例化对象,需要指定参数
   Method method3=clazz.getMethod("paramMethod", String.class,int.class);
   method3.invoke(obj, "Sam",20);
  }
 
}