现在的位置: 首页 > 综合 > 正文

反射示例

2013年03月17日 ⁄ 综合 ⁄ 共 1461字 ⁄ 字号 评论关闭

两个典型的反射Demo

通过反射我们可以访问私有变量,更改其中的値,访问私有方法等

import java.lang.reflect.Field;

public class TestReflect_2 {

	public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
		//获得class对象
    Class<?>type=Foo.class;
    Field fieldA=type.getDeclaredField("a");
    Foo foo=new Foo(); 
    System.out.println(foo.a);
    fieldA.set(foo, 30);  
   
    
    Field fieldB=type.getDeclaredField("b");
    //压制访问控制,b为私有属性
    fieldB.setAccessible(true);
    //set(目标对象,目标对象的要赋的属性值):给目标对象的属性赋值
    fieldB.set(foo, 100);
    System.out.println(foo.getB());
	}

}
class Foo{
	 int a=10;
	  private int b=12;
	  public int getB(){
		  return this.b;
	  }
}

 另外一个反射实例:

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

public class TestReflect {

	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {
        Class<?>type=Koo.class;     
        Method methodAdd=
        		type.getMethod("add", int.class,int.class);
        Koo koo=new Koo();        
        methodAdd.setAccessible(true);       
        int result=(Integer)methodAdd.invoke(koo,12,20);
	    System.out.println(result);
	    
	    
	    //getDeclaredMethos(方法名,方法的参数.class):
	    //获得声明过的任何方法
	    Method methodSub=
	    		type.getDeclaredMethod("sub", int.class,int.class);
	    //压制访问权限
	    methodSub.setAccessible(true);
	    int resultSub=(Integer) methodSub.invoke(new Koo(), 20,10);
	    System.out.println(resultSub);
	    
	    
	}

}
class Koo{
	public int add(int num1,int num2){
		return num1+num2;
	}
	private int sub(int num1,int num2){
		return num1-num2;
	}
	
}

 

抱歉!评论已关闭.