反射的前世今生(copy)

反射家族

  1. 反射是啥
    a)反射是很重要的一个机制,主要是指程序可以访问,检测和修改它本身状态和行为的一个能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语言意思。
    b)反射是java中的一个强大的工具,能够使我们很方便的创建了灵活的代码,这些代码可以再次运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高。

  2. 反射机制有啥作用
    反编译:.class –>.java
    反射机制访问java对象的属性,方法,构造方法等

  3. 在java中的反射机制类
    java.lang.Class;
    java.lang.reflect.Constructor;
    java.lang.reflect.Method;
    java.lang.reflect.Modifier;

  4. 反射功能的实现

//--------------------
//反射机制获取类有三种方法,我们来获取Employee类型
//第一种方式
ClassDemo1 = Class.forName("Employee");
//第二种方式
//java中每个类型都有class属性
ClassDemo2 = Employee.class;
//第三种方式
//java语言中任何一个java对象都有getClass方法
Emlopyee e = new Employee();
ClassDemo3 = e.getClass();

//------------------------
//创建对象:获取类以后我们来创建他的对象,利用newInstance
Class  c = Class.forNmae("Employee");
//创建此Class对象所表示的类的一个新实例
ObjectDemo = c.newInstance();

//------------------------
//获取所有的属性和指定的属性

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

System.out.println(ss);

//-------------------------
//获取特定的属性
//以前的方式
/*
User u = new User();
u.age = 12;
System.out.println(u.age);
*/
//获取类
Class c = Class.forName("User");
//获取id属性
Field idf = c.getDeclaredField("id");
//实例化这个类赋给o
Object o = c.newInstance();
//使用反射机制可以打破封装,导致了java对象的属性不安全。
//打破封装
idf.setAccessible(true);
//给o对象的id属性赋值“110”
idf.set(o,"110");
Syste.out.println(idf.get(o));
  1. 反射的获取方法和构造方法
    a)getDeclaredMethods()
    获取所有的方法
    b)getReturnType()
    获得方法的放回类型
    c)getParameterTypes()
    获得方法的传入参数
    d)getDeclaredMethod(”方法名”,参数类型.class,……)
    获得特定的方法
    e) getDeclaredConstructors()
    获得所有的构造函数
    f)getDeclaredConstructor(参数类型.class,……..)
    获得特定的构造函数
    g)getSuperclass()
    获得某类的父类
    h)getInterfaces()
    获得某类实现的接口
    使用这些方法可以获得类的各种信息,进行反编译。可以让我们代码更加灵活。
  2. 反射加配置文件,我们程序更加灵活
    在设计模式学习中,抽象工厂就用了反射来读取数据库链接字符串,我们来观察一下.NET中的反射+配置文件的使用:
    配置文件app.config.XML,内容如下:
<configuration>
    <appSettings>
        <add key = "" value = ""/>
    <appSettings>
<configuration>

反射的写法如下:

assemly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);

好处:我们很容易的变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们就写两份D层,在配置文件中改一下,或者加条件选择一下就行,so easy!

猜你喜欢

转载自blog.csdn.net/qq_42784105/article/details/81513410