在这之前,已经见过了基本的类反射应用,如何解剖Class 对象,要是您没有看,请点击这里点击打开链接
这篇文章写的是如何将Class 对象用起来,调用函数,构造方法以及如何设置变量的值。
类的调用(调用类中的成员)
构造类对象:使用构造器新建对象。根据指定的参数类型找到相应的构造函数,传入相应参数调用执行,以创建一个新的对象实例。代码演示:‘
其实是这样访问的
1,访问构造方法,必须去接一个
<span style="white-space:pre"> </span>Constructor con2=c.getConstructor(par2);需要一个构造函数里面的参数类型和数值
<span style="white-space:pre"> </span>如 Person p =new Person("Jack",20);这里面就是需要String 类型和int类型,同样的在<span style="font-family: Arial, Helvetica, sans-serif;">getConstructor中也需要Class数组,<span style="color:#ff0000;">注意:在Class 参数类型中,不带用自动拆装箱功能。但是可以使用 如 Integer.class,可以写成Integer.Type</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="color: rgb(255, 0, 0); white-space: pre;"> </span>2,获得这个构造函数之后我们就需要</span><span style="font-family: Arial, Helvetica, sans-serif;">con2.newInstance(obj2);造出一个实例,这时候就需要把具体的实参传进去,这时候有需要一个object数组,然后就这样就可以调用带参数的构造方法</span>
<span style="font-family:Arial, Helvetica, sans-serif;">下面介绍空参和带参数的演示(简单易懂)</span>
//操作类的构造方法
private static void operationConstrontor(String name) throws Exception{
Class c=Class.forName(name);
//1,操作无参构造方法
Constructor con=c.getConstructor(null);//无参数 所以可以直接获得
Object obj=con.newInstance();
System.out.println(obj+"不带参数");
//2,带参数的构造方法
//首先 通过Class 对象获得Constructor;里面需要带参数(形参),参数类型都是CLass 类型
//先确定需要参数类型
Class par2[]=new Class[4];
par2[0]=String.class;
par2[1]=String.class;
par2[2]=int.class;
par2[3]=String.class;
Constructor con2=c.getConstructor(par2);//需要形参数组
//参数确定之后,就可以传进去参数进行传参了
Object obj2[]=new Object[4];
obj2[0]="jack";
obj2[1]="tom";
obj2[2]=4;
obj2[3]="Rose";
Object ret =con2.newInstance(obj2);
System.out.println(ret+"带参数的构造方法");
}
调用方法:
根据方法名称执行方法。根据方法名与参数类型匹配指定的方法,传入相应参数与对象进行调用执行。若是静态方法,则不需传入具体对象。
代码演示:
1,首先需要c.getMethod("methodname", 参数类型),首先必须填写方法名,和参数有哪些类型,如int,String等,需要一个Class对象数组menthodname,
c.getMethod(methodname, parameterTypes) parameterTypes
<span style="font-size:14px;"> //parameterTypes需要参数的参数(有的类含有重载,方法名一样,参数类型不一样,所以必须规定参数名)
</span><span style="font-size:18px;"> //定义参数类型 Class 数组
Class param[]=new Class[1];
param[0]=String.class;</span>
<span style="font-size: 14px; white-space: pre;"> </span><span style="font-size:24px;">// 获得method对象 Method method2=c.getMethod(methodname, param);</span>
<pre name="code" class="java"><span style="font-size:24px;"><span style="white-space:pre"> </span>method2.invoke(obj2, args),对象obj2,还需要传进去的参数args</span>
<span style="font-size:24px; white-space: pre;"> </span><span style="font-size:24px;">obj2通过 </span><span style="font-size:18px;">c.new<span style="font-family: Arial, Helvetica, sans-serif;">Instance()获得,但是参数是传进需要用的参数,也即是放在一个对象数组里面,</span></span>
<span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>3,静态方法不需要参数</span></span>
<span style="font-size:14px;">private static void operationMethod(String name) throws Exception {
///传进来的字符串,类反射得到Class 对象
Class c =Class.forName(NAME);//异常抛出去便于理解
//1,操作空参方法
Method methods=c.getMethod("toString", null);//toString 没有参数,所以给null
//获得Class 对象的实例化
Object obj=c.newInstance();
//进行操作
Object res=methods.invoke(obj, null);
System.out.println(res);//{null,null,0,null}//传进来的就是空参,所以全部为初始值
//2,操作有擦数的方法
String methodname= "setName";//这是方法名,可以通过遍历得到
// c.getMethod(methodname, parameterTypes) parameterTypes
//parameterTypes需要参数的参数(有的类含有重载,方法名一样,参数类型不一样,所以必须规定参数名)
//定义参数类型 Class 数组
Class param[]=new Class[1];
param[0]=String.class;
// 获得method对象
Method method2=c.getMethod(methodname, param);
//需要对象调用,所以要实例化newInstance();
Object obj2=c.newInstance();
//method2.invoke(obj2, args),对象obj2,还需要传进去的参数
Object args[]=new Object[1];
args[0]="TOM JAck";
Object ret=method2.invoke(obj2, args);//ret为返回值
System.out.println(ret+"带参数");
//3,调用静态方法
Method method3=c.getDeclaredMethod("ret", null);
Object obj3= method3.invoke(null, null);
System.out.println(obj3+".....static.......");//静态的,所以权限必须是public
</span>
获取与设置属性值 :
根据属性名称读取与修改属性的值,访问非静态属性需传入对象为参数。
<span style="font-size:18px;">//对类里面的变量进行操作
private static void operationFeild(String name2) throws Exception{
Class c=Class.forName(name2);
Field field= c.getDeclaredField("pwd");// 由于name 是private 权限,可以获得但是不能访问
//<span style="white-space:pre"> <span style="background-color: rgb(255, 0, 0);"> </span></span><span style="background-color: rgb(255, 0, 0);">field.setAccessible(true); //传说中的暴力破解就只是添加这一句就可以了,设置可以编辑的</span>
Object obj3=c.newInstance();
field.set(obj3, "Tom");//权限私有,不能访问,必须改成public 或者暴力破解
System.out.println(field.get(obj3));
}</span>