黑马程序员---反射

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一.获取字节码对象:

1.通过类获取

 Class class=类名.class;

2.通过实例对象获取

Class class=对象.getClass();

3.通过Class类的静态方法forName

Class class=Class.forName(String className);

 

二.获取构造方法(公共的)

//获取目标类的有参构造方法 其构造方法的参数为(int a,String b);

Constructor cons=类名.class.getConstructor(int.class,String.class);

//获取默认构造方法

Constructor cons=类名.class.getConstructor();

//通过获取到的构造方法对象,来获取目标类的实例对象。

类 对象变量=(类)cons.newInstance();

类 对象变量=(类)cons.newInstance(2,"k");

 

三.获取字段

获取公共的字段

                  AA a = new AA(21, "xiao"); 
		Field field = AA.class.getField("name");//通过字节码对象获取字段名为“name”的公共字段		                  			
		field.set(a, "oaix"); //设置a对象中"name"属性的值
		System.out.println(a.getName());


 

暴力访问字段

		AA a = new AA(21, "xiao"); 
		Field field = AA.class.getDeclaredField("name");//通过字节码对象获取字段名为“name”的私有字段 		
		field.setAccessible(true);//启用和禁用访问安全检查的开关                          				
		field.set(a, "oaix"); //设置a对象中"name"属性的值
		System.out.println(a.getName());

 

获取所有字段

		AA a = new AA(21, "xiao");
		Field[] field = AA.class.getDeclaredFields();
		for (Field field2 : field) {
			field2.setAccessible(true);
			if (field2.getType() == String.class) {//获取字节码类型
				field2.set(a, "haha");
				System.out.println(a.getName());
			} else {
				System.out.println(a.getAge());
			}
		}



四.获取方法
Method中的invoke()方法 注意的是如果目标类中的方法参数是数组的话,记得在invoke()第二参数前加(Object)或者new Object[]{数组};因为在java1.4中invoke()中的第二参数是个数组,虚拟机为了兼容1.4,会对数组进行解析。invoke(aa,(Object)new String[]{"da","asd"});

		Class c=BB.class;
		
		Method method=c.getMethod("setName",String.class);//"方法名", 参数字节码(可以为null表示空参数) 
		
		Constructor cons=c.getConstructor(int.class,String.class);
		BB b=(BB) cons.newInstance(12,"xiao");//创建一个实例对象
		
		method.invoke(b,"haha");
		System.out.println(b.getName());


更新:

获取类的接口和父类

public static void printInterfaceNames(Object o) { 
Class c = o.getClass(); 
//获取反射类的接口 
Class[] theInterfaces = c.getInterfaces(); 
for(int i=0; i<theInterfaces.length; i++) 
System.out.println(theInterfaces[i].getName()); 
//获取反射类的父类(超类) 
Class theSuperclass = c.getSuperclass(); 
System.out.println(theSuperclass.getName()); 
} 



 

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值