01设计模式——反射

Posted tianming666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01设计模式——反射相关的知识,希望对你有一定的参考价值。

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设计模式——反射的主要内容,如果未能解决你的问题,请参考以下文章

(单例设计模式之一)饿汉式的反射与反序列化漏洞

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景

将 OpenGL 片段着色器设置为仅通过漫反射减少 vec4 色点的 RGB 值,而不是 alpha

反射机制

如何更改谷歌地图标记上方的标题和片段设计