1.概念

调用指定方法,利用反射,通过Method类完成。步骤:

  • 1.通过Class类的getMethod(String name,Class…parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
  • 2.之后使用Object.invoke(Object obj,Object[] args)进行调用,并向方法中传递需要设置的obj对象的参数信息。
    利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor

2.实例

2.1通过反射的办法给属性赋值

2.1.1给public属性赋值

代码

public void test3() throws NoSuchFieldException, SecurityException, Exception, IllegalAccessException{
	   Class clazz=Person.class;
	   Field name=clazz.getField("name");
	   Person p=(Person)clazz.newInstance();
	   System.out.println(p);
	   //3.将运行时类指定的属性赋值
	   name.set(p, "Tony");
	   System.out.println(p);
	   
	   Field age=clazz.getField("age");
	   
	   
	   //3.将运行时类指定的属性赋值
	   name.set(p, 10);
	   System.out.println(p);
   }

运行结果
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor
我们可以得到结果,set方法只能给public属性的变量赋值,给private属性的变量赋值就会报错:NoSuchFieldException
那么,是否可以通过把获取Field的方法改为getDeclaredField来给变量赋值呢?
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor
还是报错,不过错误变成了IllegalArgumentException

2.1.2给private以及默认类型赋值

设置属性为可访问的,即

age.setAccessible(true);

得到结果
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor

  • 总结:getField()获取运行时类中声明为public的属性,getDeclaredField()获取运行时类中所有的属性。

2.2方法

2.2.1调用public方法

代码

public void test4() throws Exception, SecurityException{
	   Class clazz=Person.class;
	   Method m1=clazz.getMethod("show");
	   Person p=(Person)clazz.newInstance();
	   Object returnValue=m1.invoke(p);
	   System.out.println(returnValue);
   }

运行结果
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor

2.2.2调用静态方法

代码

Method m3=clazz.getMethod("info");
	   Object returnValue2=m3.invoke(clazz);
	   System.out.println(returnValue2);

调用不需要类的实例,用类作为参数就可以。
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor

2.2.3调用非Public的方法

依旧是熟悉的套路和方法
代码

Method m4=clazz.getDeclaredMethod("display",String.class,int.class);
	   m4.setAccessible(true);
	   Object returnValue3=m4.invoke(p,"CHN",90);
	   System.out.println(returnValue3);

运行结果
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor

2.2.4调用指定的构造器

代码

public void test3() throws Exception{
    	String className="test.Person";
    	Class clazz=Class.forName(className);
    	Constructor con=clazz.getDeclaredConstructor(String.class,int.class);
    	Person p=(Person)con.newInstance("Tony Stack",30);
    	System.out.println(p);
    }

运行结果
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor
利用反射给属性赋值,调用方法,调用构造器--getDeclaredField,getDeclaredMethod,getDeclardConstructor

相关文章: