反射学习笔记

在学习反射之前,我们得到一个类,那么我们就会想到给这个类实例化一个对象,然后通过这个对象调用类的方法与属性。学习了反射,我们可以通过类的对象获取到类对象,然后通过类对象去获取类的属性和方法,最后调用,这个获取的方法也可以是此类的私有方法。(看起来和用起来都挺麻烦,但特别的方式就有特别的用处)

1、什么是类对象

类的对象:基于某个类new·出来的对象,也称实例对象。
类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法)。
在这里插入图片描述

2、获取类对象的方法

//通过类的对象,获取类对象。
Student s=new Student();
class c=s.getClass(); //此处的类对象则是Student
//通过类名获取类对象。
Class c=类名.class;
//通过静态方法获取类对象.
Class c=Class.forName("包名.类名");

3、反射通用操作

3.1常见方法
在这里插入图片描述
所有的方法使用的方法都是类对象.方法名,返回值则是public·后面的类型。
重点是如何获取想要的方法,并且通过类对象实行对该方法的调用。

import java.lang.reflect.Method;
public class Fanshe {
	public static void main(String[] args) {
		//以猫类作为示范
//		public class Cat {
//
//			public void eat(String food) {
//				System.out.println("猫吃"+food);
//			}
//		}
		//一直猫类的全限定名为:com.kaiven.biji.Cat
		//首先获取猫的类对象
		try {
			Class cat=Class.forName("com.kaiven.biji.Cat");
			//获取猫的eat方法  ,getMethod方法的第一个参数为方法名,第二个参数为参数类型.class,想要获取的方法中的参数,如有多个逗号分隔。
			Method m=cat.getMethod("eat", String.class);
			//准备调用该方法
			//1创建实例对象
			Object o=cat.newInstance();
			//2通过实例对象调用该方法  调用方式为:方法.invoke(创建的对象,传递的给参数的值);
			m.invoke(o, "鱼");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

利用反射调用方法可以无视是否私有方法

//获取私有方法 Method 
privateMethod=class1.getDeclaredMethod("privateMethod"); 
//设置访问权限无效 (关键是这一步)
privateMethod.setAccessible(true); 
privateMethod.invoke(zhangsan);
//获取私有属性也同样如此
//获取name属性 Field 
namefield=class1.getDeclaredField("name"); 
namefield.setAccessible(true);
Person zhangsan=(Person)class1.newInstance(); 
namefield.set(zhangsan, "张三"); //zhangsan.name="张三";

找不到合适的方法来描述反射,等实际用上了再回来添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值