java 的反射机制


一、首先什么是JAVA的反射机制
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。

二,java的反射机制有什么作用或者说是功能呢?
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判段任意一个类所具有的成员变量和方法
4.在运行时调用任一个对象的方法
5.在运行时创建新类对象

也可以这样理解
1,反编译:.class–>.java
2, 通过反射机制访问java对象的属性,方法,构造方法等;

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。

三. java中提供的反射的类
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

四. 具体功能的实现
1. 反射机制获取类有三种方法,我们来获取Employee类型
//第一种方式:
Class c1 = Class.forName(“Employee”);
//第二种方式:
//java中每个类型都有class 属性.
Class c2 = Employee.class;

            //第三种方式:
            //java语言中任何一个java对象都有getClass 方法
            Employee   e = new Employee();
            Class  c3 = e.getClass(); 
            //c3是运行时类 (e的运行时类是Employee)`这里写代码片`

2,创建对象:获取类以后我们来创建它的对象,利用newInstance:

           Class c =Class.forName("Employee");
            //创建此Class 对象所表示的类的一个新实例
           Object o = c.newInstance(); //调用了Employee的无参数构造方法.

3,获取属性:分为所有的属性和指定的属性:
a,先看获取所有的属性的写法:

  //获取整个类
        Class c = Class.forName("java.lang.Integer");
          //获取所有的属性?
        Field[] fs = c.getDeclaredFields();
          //定义可变长的字符串,用来存储属性
        StringBuffer sb = new StringBuffer();
        //通过追加的方法,将每个属性拼接到此字符串中
        //最外边的public定义
        sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
        //里边的每一个属性
        for(Field field:fs){
            sb.append("\t");//空格
            sb.append(Modifier.toString(field.getModifiers())+" ");
            //获得属性的修饰符,例如public,static等等
                sb.append(field.getType().getSimpleName() + " ");    属性的类型的名字
                sb.append(field.getName()+";\n");    //属性的名字+回车
        }
        sb.append("}");
        System.out.println(sb);

b,获取特定的属性,对比着传统的方法来学习:

public static void main(String[] args) throws Exception{            
<span style="white-space:pre">  </span>//以前的方式:
    /*
    User u = new User();
    u.age = 12; //set
    System.out.println(u.age); //get
    */

    //获取类
    Class c = Class.forName("User");
    //获取id属性
    Field idF = c.getDeclaredField("id");
    //实例化这个类赋给o
    Object o = c.newInstance();
    //打破封装
    idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
    //给o对象的id属性赋值"110"
    idF.set(o, "110"); //set
    //get
    System.out.println(idF.get(o));
}

4,获取方法,和构造方法,不再详细描述,只来看一下关键字:

这里写图片描述

这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

五。反射的优缺点

JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值