码迷,mamicode.com
首页 > 其他好文 > 详细

01设计模式——反射

时间:2018-03-13 01:06:31      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:chat   odex   private   伪代码   tde   .class   iat   代码   name   

1.   设计模式———反射

1.1. Java反射技术

Java 反射技术应用广泛,他能够配置,类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样就可以大大增强了Java的可配置性,spring IOC 的基本原理也是如此

 

1.2. 通过反射构建对象

 

1.2.1. 反射创建无参实体类

 1 public class ReflectServiceImpl {
 2     
 3     public void sayHello(String name){
 4         System.err.println("hello" + name);
 5     }
 6     
 7     public static ReflectServiceImpl getInstance(){
 8         ReflectServiceImpl object = null;
 9         try{
10             object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl").newInstance();
11         }catch(Exception e){
12             e.printStackTrace();
13         }
14         return object;
15     }
16 }

 

关注的重点

Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl").newInstance();

 

1.2.2. 一个 成员变量的实体类

 1 public class ReflectServiceImpl2 {
 2     
 3     private String name;
 4     
 5     public ReflectServiceImpl2(String name) {
 6         super();
 7         this.name = name;
 8     }
 9     
10     // 带构造方法的hello
11     public void sayHello(){
12         System.out.println("hello " + name);
13     }
14     
15     public static ReflectServiceImpl2 getInstance(String name){
16         ReflectServiceImpl2 object = null;
17         
18         // 进行反射
19         try {
20             object = (ReflectServiceImpl2) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance(name);
21         } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
22                 | NoSuchMethodException | SecurityException | ClassNotFoundException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         }
26     
27         return object;
28     }
29 }

添加了成员变量

注意:Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance(name);

getConstructor(Class<?>...) 是可变参数:参数的类型的 .class 

多个成员变变量(伪代码)

object = (ReflectServiceImpl3) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl3").getConstructor(String.class,int.class).newInstance(name, age);

红色内容表示参数类型。绿色表示的是 参数的数值

1.1. 通过反射构建 方法

方法的反射,表明已经有对象。进行方法的反射; 

方法包括的参数 ;没有参数。一个参数。多个参数;三种情况

public class ReflectMethod {

    // 无参数 ,无返回值
    public void sayHello(){
        System.out.println("hello");
    }
    
    // 无参数,有返回值
    public String returnHello(){
        return "hello";
    }
    
    // 一个参数,有返回值
    public int addOne(int num) {
        // 输入的数字加上 1
        return num + 1;
    }
    
    // 多个参数,有返回值
    public int plusNun(int x,int y){
        return x + y;
    }

}

反射的代码

 

在使用反射方法前要获取方法对象,得到了方法才能够去反射。

 

public class ReflectMethodTest {

    // 使用反射方法前,先获取反射对象
    
    ReflectMethod reflectMethod = new ReflectMethod();
    
    // 无参数 无返回值
    @Test
    public void test1() throws Exception {
        Method method = reflectMethod.getClass().getDeclaredMethod("sayHello", null);
        method.invoke(reflectMethod, null);
    }    
    
    // 一个参数,有返回值
    @Test
    public void test2() throws Exception {
        Method method = reflectMethod.getClass().getDeclaredMethod("addOne", int.class);
        
        Object invoke = method.invoke(reflectMethod, 25);
        System.out.println(invoke);
    }
    
    // 多个参数
    @Test
    public void test3() throws Exception {
        Method method = reflectMethod.getClass().getDeclaredMethod("plusNun", int.class,int.class);
        
        Object invoke = method.invoke(reflectMethod, 25,3);
        System.out.println(invoke);
    }
}

方法的反射,表明已经有对象。进行方法的反射; 

方法包括的参数 ;没有参数。一个参数。多个参数;三种情况

 

01设计模式——反射

标签:chat   odex   private   伪代码   tde   .class   iat   代码   name   

原文地址:https://www.cnblogs.com/tianming666/p/8552361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!