Java反射基础

反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。
JAVA中可以通过反射来获取 类,属性,方法,和构造器。

一 获取类,通过反射获取类有3种方式
有一个student的对象和 类
①通过Student类来获取
Class clazz=Student.class;
②通过student对象来获取
Class clazz1=student.getClass();
③通过类的路径来获取(一般尽量采用这种形式)
Class clazz2=Class.forName(“com.wy.Student”);

二、获取属性
1.先获取类
Class clazz=Class.forName(“com.wy.Student”);
2.获取属性的方法
①getField() ——类或接口的指定公共成员字段(public):包含当前类和父类所有的可直接访问,private类型的不能访问
Field field=clazz.getField(“sname”); //得到Student sname属性
Field field1=clazz.getField(“pname”);//得到父类 Person 的 pname属性
②getDeclaredField()——类或接口的指定已声明字段,但不包括继承的字段:只能是当前类所拥有的公共或私有的,不能是从父类继承的
private double smoney; //设置student私有的属性
Field field =clazz.getDeclaredField(“smoney”); //得到私有的属性,不能继承自父类
③getFields() ——返回的是一个Field数组,遵循getField()规定,访问父类和自身的所有public 属性
Field[] fields =clazz.getFields();
④getDeclaredFields()——返回也是一个Field数组,遵循getDeclaredField()规定,只能访问自身的所有方法。
Field[] fields =clazz.getDeclaredFields();

三、获取方法(int 和 Integer 不是一回事)
和获取属性一样,获取方法也有这四种(传入的参数与声明方法时参数一致)
①getMethod()——获取类或接口的指定公共成员方法/类或接口的指定已声明方法
Method method=clazz.getMethod(“study”,String.class);//获取public的study方法,参数是String类型的
②getDeclaredMethod——获取自身类中指定的声明的方法
Method method1=clazz.getDeclaredMethod(“eat”,int.class);//可以获取private的eat方法,参数是int类型
③getMthods——获取类或接口的所有公共成员方法/类或接口的指定已声明方法
Method[] methods2=clazz.getMethods();
④getDeclaredMethod——获取自身类中所有的声明的方法
Method method31=clazz.getDeclaredMethods();

四、获取构造器与创建实例
①getConstructor()——获取自身类中指定参数的构造器
Constructor c = clazz.getConstructor(String.class); 获取public类型的参数为String类型的构造器
实例: Student student = c.newInstance(“student”);
②getConstructor()——可以获取一个自身类中所有声明的构造器,包括private
Constructor c 1= clazz.getConstructor(Integer.class);//可以获取private类型的参数如Integer类型的构造器
实例: Student student = c1.newInstance(666);
③getConstructosr()——获取自身类所有的public构造器
Constructor[] c = clazz.getConstructors();
④getConstructors()——可以获取自身类所有声明的构造器
Constructor[] c1= clazz.getConstructors();

五、对属性,方法,和构造器的操作方法
1.属性
①若属性为静态属性static(此属性隶属于类)
public static int num=200;
Field num = clazz.getField(“num”);//得到num属性
num.setInt(null, 9999);//把num 设置为9999,第一个参数为对象实例
②若属性为public普通属性
Field sname = clazz.getField(“sname”);
sname.set(student, “王勃”);//第一个参数为student对象实例,不能为null
若属性为private,只能get,不能set,要不然会报错
private string sgender;
Field sgender = clazz.getDeclaredField(“sgender”);
sgender.set(student, “男”);
—java.lang.IllegalAccessException—-with modifiers “private”
但还是有一种方法,但是很不推荐使用,就是改一个权限
sgender.setAccessible(true); //然后在设置
sgender.set(student, “男”);

2.方法(执行方法 method.invoke() )
①静态方法(隶属于类)
Method mstatic = clazz.getMethod(“sstatic”, double.class);//获取mstatic静态方法
Object object = mstatic.invoke(null, 1.1);// 静态方法的执行,第一个仍是null,返回Object
②非静态方法
Method study = clazz.getMethod(“study”, String.class, int.class);//获取study方法
Object object=study.invoke(student,”abc”,123);//传入一个student对象

3.构造器创建实例
写一个类是,一定要写一个无参构造器
Javabean三要素:属性私有,get/set方法,无参构造器。

Constructor<Student>  c = clazz.getConstructor();//获取一个无参构造器
Student student =c.newInstance();   //得到student对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值