反射机制

反射:主要是指程序可以访问、检测和修改它本身状态或行为的
      一种能力,并能根据自身行为的状态和结果,调整或修改
      应用所描述行为的状态和相关的语义。
看这个概念很晕的
反射机制的作用:
  1.反编译  .class ---> .java
  2.通过反射机制访问java对象的属性,方法,构造方法等
反射机制的好处:解耦合,降低耦合度,提高安全性,可维护性

三阶段:
 1.Source 源码阶段  类加载器ClassLoader加载进内存,就成了对象
 2.Class类阶段 String name Field[] fieldd 字段 Method[] methods             方法  Constructor[] cons构造器 newInstance()对象
 3.runtime阶段  创建对象  调用方法

获取Class对象的三种方法:
   1.反射 Class.forName("");
   2.类名.class

   3.obj.getClass();


Demo3:

/*

 *Class对象能干什么?

 * 获取对象

 * 创建对象

 * 获取字段

 * 获取方法

 * 获取构造器

 */

ReflectDemo3.java:

public class ReflectDemo3 {

        publicstatic void main(String[] args) throws Exception {      

                 //获取对象

                 Classclazz = Class.forName("com.reflect.Demo3.Student");

                 Objectobj = clazz.newInstance();

//              System.out.println(obj+"asdfghj");

                

                 //获取所有公共字段(getFields())

                 Field[]fields = clazz.getFields();  //只能得到类公共的字段

                 for(Field field : fields) {

//                      System.out.println(field.getName());

                 }

                

                 //获取所有字段(getDeclaredFields())

                 Field[]fields2 = clazz.getDeclaredFields();

                 for(Field field : fields2) {

//                      System.out.println(field.getName());

                 }

                

                 //获取某个字段1

                 Fieldsex = clazz.getField("sex");

                 sex.set(obj,1);

//              System.out.println(obj);

                

                 //获取某个字段2

                 Fieldname = clazz.getDeclaredField("name");

                 name.setAccessible(true);  //暴力反射,取消访问的权限检查(查询field)

                 name.set(obj,"xxx");

//              System.out.println(obj);

                

                 //获取方法1

                 Method[]methods = clazz.getMethods(); //获取公共的方法,包括父类的

                 for(Method method : methods) {

//                      System.out.println("method:"+method.getName());

                 }

                

                 //获取方法2

                 Method[]declaredMethods = clazz.getDeclaredMethods(); //获取本类定义的所有方法,没有父类的

                 for(Method method : declaredMethods) {

                         System.out.println("method:"+method.getName()+"*****");

                 }

                

                 //获取构造器

 

                 Constructor[]cons = clazz.getConstructors();

                 for(Constructor constructor : cons) {

                         System.out.println(constructor.getName());//以字符串形式返回此构造方法的名称。

                         System.out.println(constructor.getModifiers());//获取修饰符 返回值int类型

                         System.out.println(Modifier.toString(constructor.getModifiers()));//获取修饰符

                 }

                

        }

}


Student.java:

public class Student {

        privateString name;

        privateint age;

        publicint sex;   //公有的

       

        publicString getName() {

                 returnname;

        }

        publicvoid setName(String name) {

                 this.name= name;

        }

        publicint getAge() {

                 returnage;

        }

        publicvoid setAge(int age) {

                 this.age= age;

        }

        publicint getSex() {

                 returnsex;

        }

        publicvoid setSex(int sex) {

                 this.sex= sex;

        }

        @Override

        publicString toString() {

                 return"Student [age=" + age + ", name=" + name + ",sex=" + sex + "]";

        }

       

        publicStudent(String name, int age, int sex) {

                 this.name= name;

                 this.age= age;

                 this.sex= sex;

        }

       

        publicStudent() { }

       

        publicStudent(String name) {

                 this.name= name;

        }

}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值