文章目录
1.概念
调用指定方法,利用反射,通过Method类完成。步骤:
- 1.通过Class类的getMethod(String name,Class…parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
- 2.之后使用Object.invoke(Object obj,Object[] args)进行调用,并向方法中传递需要设置的obj对象的参数信息。
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);
}
运行结果
我们可以得到结果,set方法只能给public属性的变量赋值,给private属性的变量赋值就会报错:NoSuchFieldException
那么,是否可以通过把获取Field的方法改为getDeclaredField来给变量赋值呢?
还是报错,不过错误变成了IllegalArgumentException。
2.1.2给private以及默认类型赋值
设置属性为可访问的,即
age.setAccessible(true);
得到结果
- 总结: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);
}
运行结果
2.2.2调用静态方法
代码
Method m3=clazz.getMethod("info");
Object returnValue2=m3.invoke(clazz);
System.out.println(returnValue2);
调用不需要类的实例,用类作为参数就可以。
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);
运行结果
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);
}
运行结果