两个典型的反射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; } }