Java反射机制

# 反射

## 什么是反射

照是Java提供的动态执行机制, 可以动态加载类, 动态创建对象,
动态访问属性, 动态调用方法..

静态执行: Java代码通过编译以后就是确定的推行顺序, 称为静态执行顺序

    Foo foo = new Foo();
    foo.test();

动态执行: 在运作期间才规定创建充分看似的目标, 执行好方式!

Java 反射API可以实现动态执行!

案例: 执行某类中全部的坐test为初始的方法. (必须采取下反射实现)

反射:

1. 照是Java提供的API, 接受API的供的法力!
2. 是Java底层之执行机制.

## 反射功能

### 动态加载类

    Class cls = Class.forName(类名)

意: 将类名对应之好像加载到方法区, 如果类称错误虽然抛来异常.

### 动态创建对象

    Object obj = cls.newInstance();

特点:

– 动态创建对象
– 可以创建任何对象
– cls对应之类似必须产生无参数构造器!!!
– 如果无任由参数构造器则委来特别!
– 反射API利用Constructer API支持有参数构造器, 略…

### 反射可以查询类中的方式

可以返回类吃宣称的浑法信息

    Method[] methods = cls.getDeclaredMethods(); 
    for(Method m:methods){
        System.out.println(m);//输出方法信息
    }

    Declared 声明的
    Method 方法

### 动态执行措施

行方式: 

1. 须要产生对象
2. 找到对象对应之种方法信息
    – 方法信息于接近及搜

案例:

    Method m =
cls.getDeclaredMethod(方法名);//在近似信息上查找一个主意信息
    //m 代表 cls类上之一个方信息
    Object obj=cls.newInstance();//动态创建对象
    //动态调用(invoke)方法
    Object val = m.invoke(obj);
整体代码:
  

 1 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
 2       Scanner in = new Scanner(System.in);
 3       String className = in.nextLine();
 4       //动态加载类
 5       Class<?> clas = Class.forName(className);
 6     
 7       //动态创建类对象
 8       Object instance = clas.newInstance();
 9       System.out.println(instance);
10     
11       //动态检查类中的公共成员方法信息(包括超类和接口中的公共成员方法)
12       Method[] methods = clas.getMethods();
13       for (Method method : methods) {
14         System.out.println(method);
15       }
16     
17       System.out.println("--------华丽分割线--------");
18       //动态检查类中的所有方法信息(包括私有和保护的,不包括继承)
19       Method[] declaredMethods = clas.getDeclaredMethods();
20       for (Method method : declaredMethods) {
21         System.out.println(method);
22       }
23     
24       String methodName = in.nextLine();  
25       Method m = clas.getDeclaredMethod(methodName, null);
26       //动态执行方法
27       Object invoke = m.invoke(instance, null);//invoke是方法执行完毕后的返回值
28       System.out.println(invoke);
29     }

 

### 反射用途

  1. Eclipse 的飞快菜单以了照, 利用反射发现了仿佛的性能和艺术
  2. Spring 利用了反光

  3.  动态加载类

  4. 动态创建Bean
  5. 动态注入属性, 包括个人属性注入
  6. 动态解析注解

     
    
        3. MyBatis 用了反光
            – 查询时, 动态了以查询结果好反射注入及Bean返回
       4. JUnit 下了照
       5. 注解的分析采用了反光
       6. Servlet调用使用了照

网站地图xml地图