您的位置:首页 > 编程语言 > Java开发

Java类反射再次升级

2015-09-02 21:47 489 查看
在这之前,已经见过了基本的类反射应用,如何解剖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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: